Java I/O 详解:从基础到高级

文章目录

  • 前言
  • 一、Java I/O 的核心概念
    • 1. 流(Stream)
    • 2. 字节流 vs 字符流
  • 二、Java I/O 的核心类
    • 1. 字节流
      • 文件读写
      • 缓冲流
    • 2.字符流
      • 文件读写
      • 缓冲流
  • 三、Java NIO(非阻塞 I/O)
  • 四、Java I/O 的最佳实践
  • 总结


前言

Java I/O(输入/输出)是 Java 编程中处理数据流的核心部分。无论是读写文件、网络通信,还是处理用户输入,Java I/O 都提供了强大的支持。本文将带你全面了解 Java I/O 的核心概念和使用方法。


一、Java I/O 的核心概念

1. 流(Stream)

流是 Java I/O 的基础,表示数据的流动。流分为两种:

  • 输入流(InputStream/Reader):从数据源读取数据。
  • 输出流(OutputStream/Writer):向目标写入数据。

2. 字节流 vs 字符流

  • 字节流:以字节为单位操作数据,适合处理二进制文件(如图片、视频)。核心类:InputStream、OutputStream

  • 字符流:以字符为单位操作数据,适合处理文本文件。核心类:Reader、Writer

二、Java I/O 的核心类

1. 字节流

InputStream是所有字节输入流的抽象基类,它定义了读取字节数据的基本方法。常见的字节输入流子类。有FileInputStream和BufferedInputStream。
OutputStream是所有字节输出流的抽象基类,它定义了写入字节数据的基本方法。常见的字节输出流子类。有FileOutputStream和BufferedOutputStream。

文件读写

  • FileInputStream:从文件读取字节。
  • FileOutputStream:向文件写入字节。
try (FileInputStream fis = new FileInputStream("input.txt");
     FileOutputStream fos = new FileOutputStream("output.txt")) {
    int data;
    while ((data = fis.read()) != -1) {
        fos.write(data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

缓冲流

  • BufferedInputStream:提高读取效率。
  • BufferedOutputStream:提高写入效率。
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
    int data;
    while ((data = bis.read()) != -1) {
        bos.write(data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

2.字符流

字符输入流用于从数据源(如文件、字符串等)读取字符数据。Reader是所有字符输入流的抽象基类。有FileReader和BufferedReader。
字符输出流用于将字符数据写入目标(如文件、控制台等)。Writer是所有字符输入流的抽象基类。有FileWriter和BufferedWriter。

文件读写

  • FileReader:从文件读取字符。
  • FileWriter:向文件写入字符。
try (FileReader fr = new FileReader("input.txt");
     FileWriter fw = new FileWriter("output.txt")) {
    int data;
    while ((data = fr.read()) != -1) {
        fw.write(data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

缓冲流

  • BufferedReader:提高读取效率,支持按行读取。
  • BufferedWriter:提高写入效率。
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
     BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
    }
} catch (IOException e) {
    e.printStackTrace();
}

三、Java NIO(非阻塞 I/O)

Java NIO 提供了更高效的 I/O 操作,核心组件包括:

  • Channel:数据通道,支持双向读写。
  • Buffer:数据缓冲区,用于临时存储数据。
  • Selector:多路复用器,用于管理多个 Channel。

示例:使用 NIO 复制文件

try (FileChannel sourceChannel = new FileInputStream("input.txt").getChannel();
     FileChannel destChannel = new FileOutputStream("output.txt").getChannel()) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    while (sourceChannel.read(buffer) != -1) {
        buffer.flip(); // 切换为读模式
        destChannel.write(buffer);
        buffer.clear(); // 清空缓冲区
    }
} catch (IOException e) {
    e.printStackTrace();
}

四、Java I/O 的最佳实践

  1. 使用 try-with-resources
    • 自动关闭资源,避免内存泄漏。
try (InputStream is = new FileInputStream("input.txt")) {
    // 操作流
} catch (IOException e) {
    e.printStackTrace();
}
  1. 优先使用缓冲流

    • 缓冲流可以显著提高 I/O 性能。
  2. 合理选择字节流和字符流

    • 文本文件用字符流,二进制文件用字节流。
  3. NIO 适合高并发场景

    • 对于需要处理大量连接的场景(如网络服务器),优先使用 NIO。

总结

Java I/O 是 Java 编程中不可或缺的一部分,掌握其核心概念和使用方法对于开发高效、稳定的应用程序至关重要。

你可能感兴趣的:(java,python,开发语言)