java 流不能重复使用 java 流不关闭会有什么影响_二进制文件


文件是数据的一个容器(口袋),文件可以存放大量的数据。文件很大,注定Java只能以流形式依次处理,每次处理一点点。

1. 文本文件读写

  • 写文件:输出文本字符到文件中。

-> 先创建文件,写入数据,关闭文件

FileOutputStream(节点类,负责写字节), OutputStreamWriter(转化类,负责写文件时字符到字节转化), BufferedWriter(装饰类,负责写字符到缓存区);


java 流不能重复使用 java 流不关闭会有什么影响_二进制文件_02


三者构建关系:BufferedWriter(OutputStreamWriter(FileOutputStream))

-> BufferWriter: write(写), newLine(换行)

-> try-resource语句,自动关闭资源。(一个文件被程序打开了,就处于锁定状态了,防止其他程序访问。如果程序最后退出,没有关闭文件资源,将导致其他程序不能访问该文件)

-> 关闭最外层的数据流,将会把其上所有的数据流关闭

  • 读文件:从文件中读取文本字符串

-> 先打开文件,逐行读入数据,关闭文件

FileInputStream(节点类,负责读文件字节), InputStreamReader(转化类,负责读文件时字节转字符), BufferedReader(装饰类,负责从缓存区读字符)


java 流不能重复使用 java 流不关闭会有什么影响_java 流不能重复使用_03


-> BufferReader: readLine

-> try-resource语句,自动关闭资源

-> 关闭最外层的数据流,将会把其上所有的数据流关闭


public class Main {

    public static String filePath = "/users/qjq/IdeaProjects/testFile/test.txt"; //已存在的目录路径

    public static void main(String[] args) throws IOException {
//        writeFile1();
        writeFile2();
//        readFile1();
        readFile2();
    }

    public static void writeFile1() {
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        BufferedWriter bw = null;

        try {
            fos = new FileOutputStream(filePath); // 节点类,负责写字节
            osw = new OutputStreamWriter(fos, "UTF-8"); // 转化类,负责字符转字节;此处采用UTF-8写,读的时候也要采用UTF-8
            bw = new BufferedWriter(osw); // 装饰类,负责写字符到字符串
            bw.write("我们是");
            bw.newLine();
            bw.write("Ecnus.^^");
            bw.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close(); // 关闭最后一个类,会将所有的底层流都关闭
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void writeFile2() {
        /**
         * try-resource语句,自动关闭资源。
         * try 后面可以加上一个括号,括号里面可以定义一个变量,这个变量将在try结束后,自动对变量进行释放,调用close方法。
         * try-resource语句极大提高编程效率。
         */
        try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)))) {
            bw.write("我们是");
            bw.newLine();
            bw.write("Ecnuers.^^");
            bw.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readFile1() {
        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
            fis = new FileInputStream(filePath);
            isr = new InputStreamReader(fis);
            br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null) { // 每次读取一行
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void readFile2() {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)))) {
            String line;
            // try-resource 语句,自动关闭资源
            while ((line = br.readLine()) != null) { // 每次读取一行
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


2. 二进制文件读写

二进制文件:

-> 狭义上说,二进制文件是采用字节编码,非字符编码的文件

-> 广义上说,一切文件都是二进制文件

-> 用记事本等无法打开/阅读

包括:

-> 一般二进制文件,如数据文件dat

-> 带特殊格式的文本文件,如xml等

-> 带特殊格式二进制文件,如doc,ppt等

二进制文件读写:

-> 输出数据到文件中

-> 从文件中读取数据

  • 写文件

- > 先创建文件,写入数据,关闭文件

FileOutputStream(节点类,负责写字节), BufferedOutputStream(装饰类,负责缓存字节流), DataOutputStream(装饰类,负责封装数据流,也即数据类型到字节转化)


java 流不能重复使用 java 流不关闭会有什么影响_二进制文件_04


-> DataOutputStream: flush(刷新缓存), write/writeBoolean/writeByte/writeChars/writeDouble/writeInt/writeUTF/...

-> try-resources语句,自动关闭资源。(一个文件被程序打开了,就处于锁定状态了,防止其他程序访问。如果程序最后退出,没有关闭文件资源,将导致其他程序不能访问该文件)

-> 关闭最外层的数据流,将会把其上所有的数据流关闭

  • 读文件

-> 先打开文件,读入数据,关闭文件

-> FileInputStream(节点类,负责从文件系统读字节), BufferedInputStream(装饰类,负责从缓存区读取字节流), DataInputStream(装饰类,封装数据流,字节转为数据类型)


java 流不能重复使用 java 流不关闭会有什么影响_java 流不能重复使用_05


-> DataInputStream: read/readBoolean/readChar/readDouble/readFloat/readInt/readUTF/...

-> try-resource语句,自动关闭资源

-> 关闭最外层的数据流,将会把其上所有的数据流关闭


public class Main {

    public static String filePath = "/users/qjq/IdeaProjects/testFile/test.txt"; //已存在的目录路径

    public static void main(String[] args) throws IOException {
        writeBinaryFile();
        readBinaryFile();
    }

    public static void writeBinaryFile() {
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        DataOutputStream dos = null;
        try {
            fos = new FileOutputStream(filePath); // 节点类,负责写字节
            bos = new BufferedOutputStream(fos); // 装饰类,负责写字节数据到缓冲区
            dos = new DataOutputStream(bos); // 装饰类,负责数据类型到字节转化

            dos.writeUTF("a");
            dos.writeInt(20);
            dos.writeInt(180);
            dos.writeUTF("b");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                dos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void readBinaryFile() {
        // try-resource 语句,自动关闭资源
        try (DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)))) {
            String a, b;
            int c, d;
            a = dis.readUTF();
            c = dis.readInt();
            d = dis.readInt();
            b = dis.readUTF();
            System.out.println("a:" + a);
            System.out.println("c:" + c);
            System.out.println("b:" + d);
            System.out.println("d:" + b);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


3. Zip文件读写

压缩包:zip, rar, gz, ...

Java zip包支持Zip和Gzip包的压缩和解压