Java io流详解

一、IO流

IO流: 数据的读入写出,文件的上传下载
流: 一连串流动的数据,以先入先出的方式:
数据源---->io---->目的地
数据源 : 数据的来源
目的地 : 数据流向的位置

二、流的分类

1.操作单元分:

字节流 : 万能流 *****
字符流 : 纯文本内容

2.流向分: 以程序为中心

输入流
输出流

3.功能分:

节点流 : 真实能做读入写出的
功能流 : 增强节点流的功能,提高节点流的性能

三、流的应用

1.字节输入输出流

①InputStream 字节输入流中最上层父类

    文件流 : FileInputStream 文件字节输入流->节点流  字节流  输入流  
         操作文件,数据源为文件,使用文件字节输入流
    字节数组流 : ByteArrayInputStream 字节数组输入流 ->节点流  字节流  输入流
        操作字节数组,数据源是字节输入,使用字节数组输入流
public class Class001_IO {
    public static void main(String[] args) throws IOException {
        File src = new File("D://test.txt");
        //FileInputStream(File file) 通过打开与实际文件的连接来创建 FileInputStream ,该文件由文件系统中的 File对象 file命名。
        InputStream is = new FileInputStream(src);

        //读入 int read() 每次读入一个字节数,返回读入到的字节,读不到返回-1
        /*int num = is.read();
        System.out.println((char)num);
        System.out.println((char)(is.read()));
        System.out.println((char)(is.read()));
        System.out.println(is.read());*/

        //循环读入
        /*int num = -1; //记录每次读到的字节
        while((num=is.read())!=-1){
            System.out.println((char)num);
        }*/

        //提高效率,每次读入一车(字节数组)的数据
        //byte[] car = new byte[1024];
        //int read(byte[]) 每次读入一个字节数组的数据,返回读入到字节数组中数据的个数,没有读到返回-1
        //int len = is.read(car);
        //System.out.println(new String(car,0,len));

        //当内容比较多,需要重复读入,每次读入一个字节数组中的数据
        /*byte[] car = new byte[2];
        int len = -1; //记录每次读入到数组中数据的个数
        while((len = is.read(car))!=-1){
            System.out.println(new String(car,0,len));
        }*/

        //byte[] readAllBytes() 从输入流中读取所有剩余字节。
        byte[] arr = is.readAllBytes();
        System.out.println(new String(arr));

        //关闭
        is.close();
    }
}

②OutputStream 字节流输出流

    FileOutputStream 文件字节输出流 -> 节点流
        目的地为文件
    ByteArrayOutputStream 字节数组输出流 -> 节点流
        目的地为字节数组
public class Class002_IO {
    public static void main(String[] args) throws IOException {
        //1.构建流,指定目的地
        //FileOutputStream(String name)
        //OutputStream os = new FileOutputStream("D://test.txt");  //默认覆盖原文件中内容
        OutputStream os = new FileOutputStream("D://BBB/test2.txt",true);  //boolean参数->true为追加  false为覆盖

        //2.写出
        os.write(97);

        byte[] arr = "你好再见".getBytes();

        os.write(arr);

        //3.刷出
        os.flush();

        //4.关闭
        os.close();
    }
}```

#### 字节流实现拷贝****

```java
public class Class001_CopyFile {
    public static void main(String[] args) throws IOException {
        //1.构建流(输入,输出)
        Reader rd = new FileReader("D://test.txt");
        Writer rt = new FileWriter("D://dest.txt");
        //2.读写
        //读入 int read() 每次读入一个字符数据
        //读入 int read(char[] cbuf) 将字符读入数组。返回读取的字符数,如果已到达流的末尾,则返回-1
        char[] car = new char[1024];
        int len = -1; //记录每次读入到数组中数据的个数
        while((len=rd.read(car))!=-1){
            //void write(char[] cbuf) 写一个字符数组。
            //void write(char[] cbuf, int off, int len) 写一个字符数组的一部分。
            //void write(int c) 写一个字符。
            //void write(String str) 写一个字符串。
            //void write(String str, int off, int len) 写一个字符串的一部分。
            rt.write(car,0,len);
        }
        //3.刷出
        rt.flush();
        //4.关闭
        rt.close();
        rd.close();
    }
}

数据源–>输入流–>程序–>输出流–>目的地

步骤:
    1.构建流(输入流  输出流)
    2.读入写出
    3.刷出
    4.关闭 (后打开的先关闭)

2.字符流输入输出

 Reader  字符输入流
        FileReader 文件字符输入流  ->节点流
 Writer  字符输出流
        FileWriter 文件字符输出流  ->节点流

3.功能流

①缓冲流

    缓冲流 Buffered : 加快节点流的读写效率
        字节缓冲流 :
            字节输入缓冲流 BufferedInputStream
            字节输出缓冲流 BufferedOutputStream
                无新增方法,可以发生多态
        字符流缓冲流
    		字符输入缓冲流 BufferedReader
       		    新增功能: String readLine() 读一行文字。
   	    字符输出缓冲流 BufferedWriter
               新增功能: void newLine() 写一个行分隔符。

字节缓冲流

public class Class001_BufferedInputStream {
    public static void main(String[] args) throws IOException {
        //1.构建流
        InputStream is = new BufferedInputStream(new FileInputStream("D://test.txt"));
        OutputStream os = new BufferedOutputStream(new FileOutputStream("D://test1.txt"));

        //2.读入写出
        byte[] car = new byte[1024];
        int len = -1;
        while((len = is.read(car))!=-1){
            os.write(car,0,len);
        }

        //3.刷出
        os.flush();

        //4.关闭
        os.close();
        is.close();
    }
}

字符缓冲流(存在新增功能,不能发生多态)

public class Class002_BufferedReader {
    public static void main(String[] args) throws IOException {
        //1.构建流(输入,输出)
        BufferedReader rd = new BufferedReader(new FileReader("D://test.txt"));
        BufferedWriter rt = new BufferedWriter(new FileWriter("D://dest.txt"));
        //2.读写
        String msg = null;
        while((msg=rd.readLine())!=null){
            rt.write(msg);
            //rt.newLine(); //换行符
        }
        //3.刷出
        rt.flush();
        //4.关闭
        rt.close();
        rd.close();
    }
}

②Date流(可以读写基本数据类型、字符串,不能读写对象类型等)

是字节流的功能流
        DataInputStream     Data输入流
            新增功能 : readXxx()
        DataOutputStream   Data输出流
            新增功能 : writeXxx()
public class Class003_DataInputStream {
    public static void main(String[] args) throws IOException {
        read("D://test1.txt");
    }

    //写出
    public static void wirte(String path) throws IOException {
        //1.构建输出流
        DataOutputStream os = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
        //2.准备数据
        int i = 100;
        char ch = 'a';
        boolean flag = false;
        String str = "哈哈";

        //3.写出
        os.writeInt(i);
        os.writeChar(ch);
        os.writeBoolean(flag);
        os.writeUTF(str);

        //4.刷出
        os.flush();

        //5.关闭
        os.close();
    }


    //读入
    public static void read(String path) throws IOException {
        //1.构建输入流
        DataInputStream is = new DataInputStream(new BufferedInputStream(new FileInputStream(path)));

        //2.读入
        int i = is.readInt();
        char ch = is.readChar();
        boolean flag = is.readBoolean();
        String msg = is.readUTF();
        //3.处理数据
        System.out.println(i);
        System.out.println(ch);
        System.out.println(flag);
        System.out.println(msg);

        //4.关闭
        is.close();
    }
}
上一篇:os模块批量重命名多个工作簿


下一篇:Object类 任何类都是object类的子类 用object对象接收数组 object类的向上向下转型