IO流学习

IO流

  • 一. 文件
    • 概念
    • 文件流
    • 常见的文件的操作
  • 二. IO流原理及其分类
    • 2.1 `InputStream` 和 `OutputStream`
    • 2.2 `Reader` 和 `Writer`
  • 三. 节点流和处理流
    • 3.1 节点流
    • 3.2 处理流
    • 3.3 节点流和处理流的区别和联系

一. 文件

概念

文件就是保存数据的地方,比如大家经常使用的word文档,text文档,excel文档,可以是音频也可以是视频还可以是文件。

文件流

文件在程序中是以流的形式来操作的。

  • 输入流:磁盘(文件)中的数据加载到程序(内存)中。
  • 输出流:程序(内存)中的数据加载到磁盘(文件)中。

常见的文件的操作

常见文件对象的相关的构造器和方法

  • 相关方法

    • new File(String path) // 根据路径构建一个File对象
    • new File(File parent, String child) // 根据父目录文件 + 子路径 构建
    • new File(String parent, String child) // 根据父目录 + 子目录路径 构建
  • @Test的使用:

    • alt + enter 选择一个类别
package Pac;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;


import java.io.File;
import java.io.IOException;

/**
 *
 */

public class FileCreate {
    public static void main(String[] args) {

    }

    //方式1:new File(String path) // 根据路径构建一个File对象
    @Test
    public void create01(){
        String filePath = "e:\\news1.txt";
        File file = new File(filePath);
        try{
            file.createNewFile();
            System.out.println("news1.txt文件创建成功~");
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    //方式2: new File(File parent, String child) // 根据父目录文件 + 子路径 构建
    //e:\\new2.txt
    @Test
    public void create02(){
        File parentFile = new File("e:\\");
        String fileName = "news2.txt";
        File file = new File(parentFile,fileName);   //在这里里,仅仅是在内存里面有file
        try{
            file.createNewFile();                    //执行了create才是真正将file写在磁盘里面
            System.out.println("news2.txt文件创建成功~ ");
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    //方式3:new File(String parent, String child) // 根据父目录 + 子目录路径 构建
    @Test
    public void create03(){
        String parentPath = "e:\\";
        String filePath = "news3.txt";
        File file = new File(parentPath, filePath);

        try{
            file.createNewFile();
            System.out.println("news3.txt文件创建成功~");
        }catch(IOException e){
            e.printStackTrace();
        }
    }


}

  • 获取文件的相关的信息
    • getName、getAbsolutePath、getParent、length、exits、isFile、isDirectory
package Pac;

import org.junit.jupiter.api.Test;

import java.io.File;

/**
 *
 */

public class FileInformation {
    public static void main(String[] args) {

    }
    //获取文件的信息
    @Test
    public void info(){
        //先创建文件的对象
        File file = new File("e:\\news1.txt");

        //调用相应的方法,得到对应的信息
        System.out.println("文件名字 = " + file.getName());

        // 常用的文件的方法: getName、getAbsolutePath、getParent、length、exits、isFile、isDirectory
        System.out.println("文件的绝对路径 = " + file.getAbsolutePath());

        System.out.println("文件的父目录 = " + file.getParent());

        System.out.println("文件的大小 = " + file.length());

        System.out.println("文件是否存在" + file.exists());

        System.out.println("是否是一个文件" + file.isFile());

        System.out.println("是否是一个目录" + file.isDirectory());


    }
}

"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar=52010:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-launcher\1.7.0\junit-platform-launcher-1.7.0.jar;D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\plugins\junit\lib\junit5-rt.jar;D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;E:\刘建成\java\project\Pro\out\production\Mud;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter\5.7.0\junit-jupiter-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.0\junit-jupiter-api-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.7.0\junit-platform-commons-1.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.7.0\junit-jupiter-params-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0\junit-jupiter-engine-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.7.0\junit-platform-engine-1.7.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 Pac.FileInformation,info
文件名字 = news1.txt
文件的绝对路径 = e:\news1.txt
文件的父目录 = e:\
文件的大小 = 14
文件是否存在true
是否是一个文件true
是否是一个目录false

Process finished with exit code 0

  • 目录的操作和文件的删除
    • mkdir创建一级目录、mkdirs创建多级目录、delete删除空目录或者文件
package Pac;

import org.junit.jupiter.api.Test;

import java.io.File;

public class Directory_ {
    public static void main(String[] args) {

        //
    }

    //判断E盘中 E:\\news1.txt是否存在,如果存在则删除
    @Test
    public void m1(){
        String filePath = "d:\\news1.txt";
        File file = new File(filePath);
        if(file.exists()){
            if(file.delete()){
                System.out.println(filePath + "删除成功");
            } else{
                System.out.println(filePath + "删除失败");
            }       
        }else{
            System.out.println("该文件不存在......");
        }

    }



}

二. IO流原理及其分类

  • 按照操作的数据单位不同:字节流(8 bit), 字符流(按字符)
  • 按数据流的流向分为:输入流、输出流
  • 按照流的角色分为:节点流,处理流 / 包装流
抽象基类 字符流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
  • Java的IO流共涉及40多个类,实际上非常的规则,都是从如上4个抽象基派生出来的。
  • 由这四个类派生出来的子类的名称都是其父类名作为子类名的后缀的。

IO流学习_第1张图片

2.1 InputStreamOutputStream

  • InputStream抽象类是所有类字节输入流的超类

  • InputStream抽象类的常用子类

      1. FileInputStream: 文件输入流
      1. BufferedInputStream: 缓冲字节输入流
      1. ObjectInputStream: 对象字节输入流
  • OutputStream抽象类的常用子类

      1. FileOutputStream: 文件输出流

FileInputStream

IO流学习_第2张图片

package PacinputStream;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStream_ {

    public static void main(String[] args) {

    }

	
     //单个字节的读取,运行效率比较低
    @Test
    public void readFile01() {
        String filePath = "e:\\hello.txt";
        int readData = 0;
        //创建了FileInputStream对象,用于读取hello.txt文件
        FileInputStream fileInputStraem = null;
        try {
            //创建了FileInputStream对象,用于读取hello.txt文件
            fileInputStraem = new FileInputStream(filePath);
            // 从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
            // 如何返回-1,表示读取完毕
            while((readData = fileInputStraem.read()) != -1){
                System.out.print((char)readData);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //当文件读取完毕的时候,一定要关闭流,释放资源
            try {
                fileInputStraem.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar=53612:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-launcher\1.7.0\junit-platform-launcher-1.7.0.jar;D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\plugins\junit\lib\junit5-rt.jar;D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;E:\刘建成\java\project\Pro\out\production\Mud;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter\5.7.0\junit-jupiter-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.0\junit-jupiter-api-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.7.0\junit-platform-commons-1.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.7.0\junit-jupiter-params-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0\junit-jupiter-engine-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.7.0\junit-platform-engine-1.7.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 PacinputStream.FileInputStream_,readFile01
hello world,刘建成


Process finished with exit code 0



package PacinputStream;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStream_ {

    public static void main(String[] args) {

    }

    /**
     * 单个字节的读取,效率比较低
     * ->使用read(byte[] b)
     */

    @Test
    public void readFile01() {
        String filePath = "e:\\hello.txt";
        int readData = 0;
        //创建了FileInputStream对象,用于读取hello.txt文件
        FileInputStream fileInputStraem = null;
        try {
            //创建了FileInputStream对象,用于读取hello.txt文件
            fileInputStraem = new FileInputStream(filePath);
            // 从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。 
            // 如何返回-1,表示读取完毕
            while((readData = fileInputStraem.read()) != -1){
                System.out.print((char)readData);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //当文件读取完毕的时候,一定要关闭流,释放资源
            try {
                fileInputStraem.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }



    //优化代码:

    /**
     * 使用read(byte[] b)读取文件
      * @param b
     */
    
    @Test
    public void readFile02() {
        String filePath = "e:\\hello.txt";
        int readData = 0;
        //定义一个字节数组
        byte[] buf = new byte[8];   //一次性读取8个字节
        int readLen = 0;
        
        //创建了FileInputStream对象,用于读取hello.txt文件
        FileInputStream fileInputStraem = null;
        try {
            //创建了FileInputStream对象,用于读取hello.txt文件
            fileInputStraem = new FileInputStream(filePath);
            
            // 从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
            
            // 如何返回-1,表示读取完毕
            while((readLen = fileInputStraem.read(buf)) != -1){ //实际读取到的值
                System.out.print(new String(buf,0,readLen));       //显示
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //当文件读取完毕的时候,一定要关闭流,释放资源
            try {
                fileInputStraem.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


}

"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar=53812:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-launcher\1.7.0\junit-platform-launcher-1.7.0.jar;D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\plugins\junit\lib\junit5-rt.jar;D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;E:\刘建成\java\project\Pro\out\production\Mud;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter\5.7.0\junit-jupiter-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.0\junit-jupiter-api-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.7.0\junit-platform-commons-1.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.7.0\junit-jupiter-params-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0\junit-jupiter-engine-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.7.0\junit-platform-engine-1.7.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 PacinputStream.FileInputStream_,readFile02
hello world


Process finished with exit code 0


FileOutputStream

IO流学习_第3张图片

package PacoutputStream;

import org.junit.jupiter.api.Test;

import java.io.*;

public class OutputStream_ {

    /**
     * 要求:请使用FileOutputStream在a.txt文件中写入“Hello,world”。 [如果文件不存在,会创建文件]
     * (注意:前提是目录已经存在)
     * @param args
     */

    public static void main(String[] args) {

    }

    /**
     * 演示使用FileOutputStream写入文件,将数据写到文件中,如果该文件不存在则创建该文件
     *
     */
    @Test
    public void writeFile(){
        //创建按我们的FileOutputStream对象
        String filePath = "e:\\a.txt";

        FileOutputStream fileOutputStream = null;
        try {
            //得到fileOutputStream对象

            fileOutputStream = new FileOutputStream(filePath,true);
            //写入一个字节
//            fileOutputStream.write('H');


            //1.这种方法是写入覆盖原来的内容
            //写入字符串
             String str = "hello,world!";
             //str.getBytes()可以将字符串转成字符数组
             fileOutputStream.write(str.getBytes());
            /**从位于偏移量 off的指定字节数组写入 len字节到该文件输出流。
             * public void write(byte[] b,
             *                   int off,
             *                   int len)
             *            throws IOException
             *
             * 从位于偏移量off的指定字节数组写入len字节到文件的输出流
             *
             */
            str = "hi,world,Martin!";
            fileOutputStream.write(str.getBytes(),0,str.length());

            //2.如果不希望覆盖原先的内容
            /**
             * public FileOutputStream(File file,
             *                         boolean append)
             *                  throws FileNotFoundException
             *
             * file-要写入的文件
             * append-如果为True,则写入文件的末尾,而不是开头。追加文件,而非覆盖。
             */
            fileOutputStream.write(str.getBytes(),0,str.length());


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //将流关闭
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

}



FileInputStream 和 FileOutputStream

package PacoutputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
    public static void main(String[] args) {
        //完成文件拷贝,将e://Koala.jpg 拷贝c:\\
        //思路分析
        //1. 创建的文件的输入流,将文件读入到程序
        //2. 创建文件的输出流,将读取到的文件的数据写入到指定的位置

        //在完成程序时,应该是读取部分数据就写入到指定的文件中,这里是使用的循环操作。
        //而不是将读取全部数据,直接写入全部数据。
        String srcFilePath = "e:\\Koala.jpg";
        String destFilePath = "d:\\Koala.jpg";

        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;

        try {
            fileInputStream = new FileInputStream(srcFilePath);
            fileOutputStream = new FileOutputStream(destFilePath);

            //定义一个字节数组,提高读取效率
            byte[] buf = new byte[1024];
            int readLen = 0;
            while((readLen = fileInputStream.read(buf)) != -1){
                //读取到后,就写入到文件,通过fileOutputStream
                //即,是一边读一边写
                fileOutputStream.write(buf,0,readLen);

            }
            System.out.println("拷贝ok~");


        } catch (IOException e) {

            e.printStackTrace();

        } finally {
            //关闭释放资源
            try {
                //如果输入流不等于空,则关闭输入流
                if(fileInputStream != null){
                    fileInputStream.close();
                }
                //如果输出流不等于空,则关闭输出流
                if(fileOutputStream != null){
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

}

"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" "-javaagent:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\lib\idea_rt.jar=54854:D:\软件下载\idea\idea\IntelliJ IDEA 2021.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;E:\刘建成\java\project\Pro\out\production\Mud;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter\5.7.0\junit-jupiter-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.0\junit-jupiter-api-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\Administrator\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-commons\1.7.0\junit-platform-commons-1.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.7.0\junit-jupiter-params-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0\junit-jupiter-engine-5.7.0.jar;C:\Users\Administrator\.m2\repository\org\junit\platform\junit-platform-engine\1.7.0\junit-platform-engine-1.7.0.jar" PacoutputStream.FileCopy
拷贝ok~

Process finished with exit code 0

2.2 ReaderWriter

  • FileReader: 字符流,按照字符来操作
    • FileReader相关方法:
      • new FileReader(File/String)
      • read : 每次读取单个字符,返回该字符,如果文件末尾返回-1
      • read(char[]) : 批量读取多个字符到数组,返回读取到的字符数,如果到文件末未返回-1
    • 相关的API
      • new String(char[]) : 将char[]转换成String
      • new String(char[], off, len) : 将char[]指定的部分转换为String
  • FileWriter:字符流,按照字符来操作
    • FileWriter相关方法:

      • new FileWriter(File/String): 覆盖模式,相当于流的指针在首端, 这里的覆盖模式是指,对于原来的文件。我们可以覆盖掉,如果在同一个try里面,则实际上是进行的追加的。try结束了之后,再重新覆盖的。
      • new FileWriter(File/String, true): 追加模式,相当于流的指针在尾端
      • write(int): 写入单个字符
      • write(char[]): 写入指定数组
      • write(Char[], off, len): 写入指定数组的指定部分
      • write(String): 写入整个字符串
      • write(Strng, off, len): 写入字符串的指定的部分
    • 相关的API

      • String
      • toCharArray: 将String转换为char[]
    • FileWriter使用后,必须要关闭(close)或者刷新(flash),否则写入不到指定的文件



FileReader

IO流学习_第4张图片


package PacReader;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 */

public class FileReader_ {
    public static void main(String[] args) {

    }

    /**
     * 单个字符读取文件
     */
    @Test
    public void readFile01() {

        String flaPath = "e:\\story.txt";
        FileReader fileReader = null;
        int data = ' ';
        //1.先创建一个FileReader对象
        try {
            fileReader = new FileReader(flaPath);
            //循环读取,使用read方法,单个字符读取
            while((data=fileReader.read()) != -1){
                System.out.print((char)data);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fileReader != null){
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    /**
     * 多个字符读取文件
     */
    @Test
    public void readFile02() {

        String flaPath = "e:\\story.txt";
        FileReader fileReader = null;
        int readLen = 0;
        char[] buf = new char[8];
        //1.先创建一个FileReader对象
        try {
            fileReader = new FileReader(flaPath);
            //循环读取,使用read(buf)方法,返回的是实际读取到的字符数
            //如果返回-1,说明文件结束
            while((readLen=fileReader.read(buf)) != -1){
                System.out.print(new String(buf,0,readLen));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fileReader != null){
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}






FileWriter

IO流学习_第5张图片



三. 节点流和处理流

3.1 节点流

  • 节点流可以从一个特定的数据源读写数据, 如: FileReaderFileWriter[源码]

3.2 处理流

  • 处理流也叫包装流,是连接在已存在的流(节点流或处理流)之上,为程序提供更加强大的读写功能,如: BufferedReaderBufferedWriter[源码]

3.3 节点流和处理流的区别和联系

    1. 节点流是底层流/低级流,直接和数据源相接
    1. 处理流(包装流)包装节点流,既可以消除不同节点流实现差异,也可以提供更方便的方法来完成输入输出。[源码理解]
    1. 处理流(也叫包装流),对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连。[模拟修饰器设计模式]


BufferedReader

IO流学习_第6张图片

IO流学习_第7张图片

从这里可以看出,BufferedReader里面有一个Reader属性。个属性只要是Reader的子类都是可以的。

IO流学习_第8张图片


实现具体的BufferedReader代码

package PacReader01;

import java.io.BufferedReader;
import java.io.FileReader;

/**
 * 演示BufferedReader的使用
 */
public class BufferedReader_ {
    public static void main(String[] args) throws Exception{
        String filePath = "E:\\a.java";
        //创建BufferedReader对象,节点流对象为FileReader
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));

        //读取
        /**
         * bufferedReader.readLine();表示按行读取;当返回为null时,表示读取完毕
         */
        String line;    //按行读取,效率高
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

        //关闭流,仅仅需要关闭外层流就可以了。因为底层会去自动的关闭节点流
        //FileReader
        bufferedReader.close();


    }
}



BufferedWriter

IO流学习_第9张图片

IO流学习_第10张图片
从这里可以看出,BufferedWriter里面有一个Reader属性。这个属性只要是Writer的子类都是可以的。
IO流学习_第11张图片


实现具体的BufferedWriter代码

package PacReader01;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 演示BufferedWriter的使用
 */

public class BufferedWriter_ {
    public static void main(String[] args) throws IOException {
        String filePath = "e:\\\\ok.txt";
        //创建一个BufferedWriter
        //说明:
        //	1. new FileWriter(filePath,true) 表示以追加的方式写入
        //  2. new FileWriter(filePath)      表示以覆盖的方式写入
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));

        bufferedWriter.write("hello1,思格露教育");
        //bufferedWriter插入一个和系统相关的换行符
        bufferedWriter.newLine();

        bufferedWriter.write("hello2,思格露教育");
        //bufferedWriter插入一个和系统相关的换行符
        bufferedWriter.newLine();


        bufferedWriter.write("hello3,思格露教育");
        //bufferedWriter插入一个和系统相关的换行符
        bufferedWriter.newLine();


        //关闭外层流即可,传入的new FileWriter(filePath) 会在底层关闭
        bufferedWriter.close();

    }

}

你可能感兴趣的:(java学习交流,学习,java,junit)