无论是桌面软件、服务器后台,还是移动应用,文件读写和数据传输都是核心功能。Java 提供了丰富的 I/O API,从传统的字节流、字符流到现代的 NIO(Non-blocking I/O)框架,都能满足不同场景的需求。
本文将深入解析 Java I/O 的核心机制和实战技巧,涵盖:
Java I/O 最早的模型是基于流的概念。数据以流的形式从源头流向目的地。
java复制编辑try (FileInputStream fis = new FileInputStream("input.dat")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
// 处理字节
System.out.println("读取了 " + bytesRead + " 字节");
}
} catch (IOException e) {
e.printStackTrace();
}
java复制编辑try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("读取行: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
java复制编辑try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("Hello, Java I/O!");
writer.newLine();
writer.write("写入结束");
} catch (IOException e) {
e.printStackTrace();
}
缓冲流通过减少物理读写次数极大提升效率。
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
java复制编辑try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("dest.jpg"))) {
byte[] buffer = new byte[8192];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
Java NIO(New I/O)在 Java 1.4 引入,提供了更高效的 I/O 操作方式。
组件 | 描述 |
---|---|
Buffer | 数据容器 |
Channel | 连接实体,读写数据的通道 |
Selector | 多路复用器,实现非阻塞I/O |
java复制编辑ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello NIO".getBytes());
buffer.flip(); // 切换到读取模式
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
java复制编辑try (FileChannel inChannel = new FileInputStream("input.txt").getChannel();
FileChannel outChannel = new FileOutputStream("output.txt").getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inChannel.read(buffer) != -1) {
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
Selector 允许单线程管理多个网络连接,实现高性能服务器。
java复制编辑// 示例略,核心思想是通过 Selector 监听多个 Channel 的事件
Paths.get()
和 Files
操作更便捷(Java 7+)
java复制编辑Path path = Paths.get("test.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
java复制编辑if (!Files.exists(path)) {
Files.createFile(path);
}
结合 NIO 零拷贝技术,实现快速复制。
java复制编辑try (FileChannel source = FileChannel.open(Paths.get("large.iso"), StandardOpenOption.READ);
FileChannel target = FileChannel.open(Paths.get("copy.iso"), StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
long size = source.size();
long transferred = 0;
while (transferred < size) {
transferred += source.transferTo(transferred, size - transferred, target);
}
} catch (IOException e) {
e.printStackTrace();
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。