一文理解Java I/O流

Java I/O(Input/Output)流是 Java 中用于处理数据读写的核心机制。

输入流(Input):从外部(文件、网络等)读取数据到程序。

输出流(Output):从程序写出数据到外部。

流(Stream):比喻为“管道”,顺序传输字节或字符。

字节流(InputStream / OutputStream):处理二进制数据(如图片、视频)。

字符流(Reader / Writer):处理文本数据(基于字符编码)。

节点流(低级流):直接操作数据源(如文件流)。

处理流(高级流):连接在其他流上,增强功能(如缓冲流、对象流)。

低级流(节点流)和高级流(处理流)。这两类流分别用于直接访问数据源以及对已有流进行功能增强或组合使用。

低级流也称为节点流,它们直接与数据源(如文件、网络连接等)相连,负责实际的数据读写操作。

高级流建立在低级流之上,为数据处理提供额外的功能,比如缓冲、转换编码、格式化输出等。

【字节流(字节输入/输出流)】

1.文件输入流(FileInputStream)从文件读取字节数据

int read():读取单个字节(返回值为 int,末尾返回 -1)。

2.文件输出流(FileOutputStream)向文件写入字节数据

new FileOutputStream("file", true)//加true代表追加,不加true代表覆盖

示例:复制文件(块读写)

try (FileInputStream fis = new FileInputStream("source.bin");
     FileOutputStream fos = new FileOutputStream("dest.bin")) {
    byte[] buffer = new byte[1024*8];//创建一次读取的字节数
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, bytesRead); // 避免写入无效数据
    }
} catch (IOException e) {
    e.printStackTrace();
}

【字符流(字符输入/输出流)】

1.字符输入流(Reader)读取字符数据(自动处理编码)。

FileReader:直接读取文件(默认使用系统编码)。

InputStreamReader:将字节流转换为字符流(可指定编码)。

2.字符输出流(Writer)写入字符数据。

FileWriter:直接写入文件(默认使用系统编码)。

OutputStreamWriter:将字节流转换为字符流(可指定编码)。

示例:写入和读取文本文件

// 写入
try (FileWriter writer = new FileWriter("text.txt")) {
    writer.write("Hello, Java IO!\n");
} catch (IOException e) {
    e.printStackTrace();
}

// 读取
try (FileReader reader = new FileReader("text.txt")) {
    int c;
    while ((c = reader.read()) != -1) {
        System.out.print((char) c);
    }
} catch (IOException e) {
    e.printStackTrace();
}

【缓冲流(提高效率)】

1.字节缓冲流

BufferedInputStream / BufferedOutputStream

内部维护缓冲区(默认 8KB),减少磁盘 I/O 次数。块读写,适合大文件操作。

2.字符缓冲流

BufferedReader / BufferedWriter

支持按行读写(readLine() / newLine())。适合文本处理,如日志文件、配置文件。

示例:按行读取文件

try (BufferedReader reader = new BufferedReader(new FileReader("log.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

【对象流(序列化与反序列化)】

1.对象输出流(ObjectOutputStream)将 Java 对象序列化为字节流

前提是:对象类必须实现 Serializable接口。

2.对象输入流(ObjectInputStream)从字节流反序列化为 Java 对象

示例:对象序列化与反序列化

//序列化
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"))) {
    Person p = new Person("Alice", 25);
    oos.writeObject(p);
} catch (IOException e) {
    e.printStackTrace();
}

// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"))) {
    Person p = (Person) ois.readObject();
    System.out.println(p);
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

【转换流(衔接字节流与字符流)】

1.InputStreamReader将字节输入流转换为字符输入流(支持指定编码)

try(InputStreamReader isr = new InputStreamReader(new FileInputStream("utf8.txt"), StandardCharsets.UTF_8)) {
      int c;
      while ((c = isr.read()) != -1) {
          System.out.print((char) c);
      }
  } catch (IOException e) {
      e.printStackTrace();
  }

2.OutputStreamWriter将字节输出流转换为字符输出流

try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), StandardCharsets.GBK)) {
      osw.write("你好,世界!");
  } catch (IOException e) {
      e.printStackTrace();
  }

【高级字符流(PrintWriter)】

自动刷新:调用 println() 后自动 flush()

支持按行写入字符串,适合日志记录。

try (PrintWriter pw = new PrintWriter(new FileWriter("note.txt"), true)) {
    Scanner scanner = new Scanner(System.in);
    while (true) {
        String line = scanner.nextLine();
        if ("break".equalsIgnoreCase(line)) break;
        pw.println(line); 
    }
} catch (IOException e) {
    e.printStackTrace();
}

以上就是Java I/O 流的主要概念以及用法。实际开发中,灵活组合节点流与处理流(如BufferedOutputStream 加 FileOutputStream),能高效地完成复杂的数据读写任务。

 

【文件流】

FileInputStream 和 FileOutputStream用于从文件中读取或向文件中写入字节数据

    FileInputStream fis = new FileInputStream("input.txt");

    FileOutputStream fos = new FileOutputStream("output.txt");

FileReader 和 FileWriter用于读取或写入字符数据,适用于文本文件

    FileReader fr = new FileReader("input.txt");

    FileWriter fw = new FileWriter("output.txt");

【网络流】

Socket和ServerSocket流用于通过网络套接字读写数据

    Socket socket = new Socket("host", port);

    InputStream in = socket.getInputStream();

    OutputStream out = socket.getOutputStream();

每种流都有其特定的应用场景,选择合适的流类型对于提高程序性能和实现所需功能至关重要。理解这些流的工作原理及其相互之间的关系有助于更有效地利用Java的I/O流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值