Skip to content

Java IO - 03 字节流

本文主要介绍在Java中如何利用字节流进行文件的读写。字节流是指以字节为单位进行传输数据的流。接口为InputStreamOutputstream

Java IO流体系如下:

image-20250205175951448

1. 字节输入流

字节输入流是指以字节为单位,从硬盘或网络获取数据到内存中的流。这里以FileInputStream为例,介绍字节输入流:

java
public static void main(String[] args) throws IOException {
    // 打开字节输入里
    InputStream inputStream = new FileInputStream("src/main/resources/data.txt");

    byte[] buffer = new byte[1024];  // 定义字节缓冲区
    int readLenfth = inputStream.read(buffer);  // 读取到的字节数
    while (readLenfth != -1) {  // 如果到达了文件末尾,则读取到的字节数为-1
        System.out.print(new String(buffer, 0, readLenfth));

        readLenfth = inputStream.read(buffer);
    }

    // 关闭字节输入流
    inputStream.close();
}

字节输入流不能解决中文乱码问题。

2. 字节输出流

字节输出流是指以字节为单位,将数据从内存写出到硬盘或网络中的流。这里以FileOutputStream为例,介绍字节输出流:

java
public static void main(String[] args) throws IOException {
    // 1. 打开字节输出流,可以覆盖写入或追加写入
    OutputStream outputStream = new FileOutputStream("src/main/resources/output.txt");
    // 2. 准备数据
    String data = "hello world, 你好 世界";
    // 3. 写入数据
    outputStream.write(data.getBytes(StandardCharsets.UTF_8));
    // 4. 刷新缓冲区
    outputStream.flush();
    // 5. 关闭字节输出流
    outputStream.close();

}

3. 案例:复制文件

利用字节输入流和字节输出流,实现文件的复制:

java
public static void main(String[] args) throws IOException {
    // 准备字节输入流和输出流,输入流作为源文件,输出流作为目标地址
    InputStream inputStream = new FileInputStream("src/main/resources/data.txt");
    OutputStream outputStream = new FileOutputStream("src/main/resources/data_copy.txt");

    // 实现复制
    byte[] buffer = new byte[1024];
    int readLength;
    while ((readLength = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, readLength);
    }

    // 关闭资源
    outputStream.close();
    inputStream.close();
}

字节流可以复制一切文件。

4. 关闭资源方案

4.1 try-catch-finally

java
public static void main(String[] args) {
    // 1. 打开字节输出流,可以覆盖写入或追加写入
    OutputStream outputStream = null;
    try{
        outputStream = new FileOutputStream("src/main/resources/output.txt");
        // 2. 准备数据
        String data = "hello world, 你好 世界";
        // 3. 写入数据
        outputStream.write(data.getBytes(StandardCharsets.UTF_8));
        // 4. 刷新缓冲区
        outputStream.flush();
    }catch (Exception e){
        // 处理异常
        e.printStackTrace();
    }finally {
        if(outputStream != null){
            // 5. 关闭字节输出流
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在finally块中关闭资源。

4.2 try-with-resource

image-20250205181732513

java
public static void main(String[] args) {
    // 1. 打开字节输出流,可以覆盖写入或追加写入
    try(OutputStream outputStream = new FileOutputStream("src/main/resources/output.txt");){
        // 2. 准备数据
        String data = "hello world, 你好 世界";
        // 3. 写入数据
        outputStream.write(data.getBytes(StandardCharsets.UTF_8));
        // 4. 刷新缓冲区
        outputStream.flush();
    }catch (Exception e){
        // 处理异常
        e.printStackTrace();
    }
}