无论是桌面软件、服务器后台,还是移动应用,文件读写和数据传输都是核心功能。Java 提供了丰富的 I/O API,从传统的字节流、字符流到现代的 NIO(Non-blocking I/O)框架,都能满足不同场景的需求。
本文将深入解析 Java I/O 的核心机制和实战技巧,涵盖:
Java I/O 最早的模型是基于流的概念。数据以流的形式从源头流向目的地。
java复制编辑try (FileInputStreamfis=newFileInputStream("input.dat")) {
byte[] buffer = newbyte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
// 处理字节
System.out.println("读取了 " + bytesRead + " 字节");
}
} catch (IOException e) {
e.printStackTrace();
}
java复制编辑try (BufferedReaderreader=newBufferedReader(newFileReader("input.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("读取行: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
java复制编辑try (BufferedWriterwriter=newBufferedWriter(newFileWriter("output.txt"))) {
writer.write("Hello, Java I/O!");
writer.newLine();
writer.write("写入结束");
} catch (IOException e) {
e.printStackTrace();
}
缓冲流通过减少物理读写次数极大提升效率。
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
java复制编辑try (BufferedInputStreambis=newBufferedInputStream(newFileInputStream("source.jpg"));
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("dest.jpg"))) {
byte[] buffer = newbyte[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复制编辑ByteBufferbuffer= ByteBuffer.allocate(1024);
buffer.put("Hello NIO".getBytes());
buffer.flip(); // 切换到读取模式while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
java复制编辑try (FileChannelinChannel=newFileInputStream("input.txt").getChannel();
FileChanneloutChannel=newFileOutputStream("output.txt").getChannel()) {
ByteBufferbuffer= 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复制编辑Pathpath= Paths.get("test.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
java复制编辑if (!Files.exists(path)) {
Files.createFile(path);
}
结合 NIO 零拷贝技术,实现快速复制。
java复制编辑try (FileChannelsource= FileChannel.open(Paths.get("large.iso"), StandardOpenOption.READ);
FileChanneltarget= FileChannel.open(Paths.get("copy.iso"), StandardOpenOption.WRITE, StandardOpenOption.CREATE)) {
longsize= source.size();
longtransferred=0;
while (transferred < size) {
transferred += source.transferTo(transferred, size - transferred, target);
}
} catch (IOException e) {
e.printStackTrace();
}
作者: 小菜菜编程, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-4114532.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
开发工匠 2025-6-12 10:10
eeNick 2025-6-11 08:59