Java基础 - IO/NIO
3. IO/NIO
3.1 传统IO(BIO)
3.1.1 字节流
InputStream/OutputStream:
FileInputStream/FileOutputStream:文件流BufferedInputStream/BufferedOutputStream:缓冲流DataInputStream/DataOutputStream:数据流ObjectInputStream/ObjectOutputStream:对象流
3.1.2 字符流
Reader/Writer:
FileReader/FileWriter:文件流BufferedReader/BufferedWriter:缓冲流InputStreamReader/OutputStreamWriter:转换流
面试重点:
- 字节流 vs 字符流
- 什么时候用字节流?什么时候用字符流?
- 缓冲流的作用
java
// 字节流读取文件
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
// 处理数据
}
}
// 字符流读取文件
try (FileReader fr = new FileReader("file.txt");
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
// 处理数据
}
}3.2 NIO(New IO)
核心组件:
Channel:通道Buffer:缓冲区Selector:选择器
特点:
- 非阻塞IO
- 面向缓冲区
- 支持选择器(多路复用)
面试重点:
- NIO vs BIO的区别
- NIO的三大核心组件
- 零拷贝(Zero Copy)
java
// NIO读取文件
try (FileChannel channel = FileChannel.open(Paths.get("file.txt"),
StandardOpenOption.READ)) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (channel.read(buffer) != -1) {
buffer.flip(); // 切换为读模式
// 处理数据
buffer.clear(); // 清空缓冲区
}
}Buffer的四个属性:
capacity:容量limit:限制position:位置mark:标记
3.3 AIO(Asynchronous IO)
特点:
- 异步非阻塞IO
- 基于事件和回调机制
面试重点:
- AIO vs NIO的区别
- 使用场景
java
// AIO读取文件
AsynchronousFileChannel channel = AsynchronousFileChannel.open(
Paths.get("file.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
// 读取完成
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
// 读取失败
}
});3.4 文件操作
常用操作:
- 文件读写
- 文件复制
- 目录遍历
- 文件监控
面试重点:
- Files类的使用
- Path和Paths的使用
- 文件操作的最佳实践
java
// 使用Files类操作文件
// 读取文件
List<String> lines = Files.readAllLines(Paths.get("file.txt"));
// 写入文件
Files.write(Paths.get("file.txt"), "content".getBytes());
// 复制文件
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
// 删除文件
Files.delete(Paths.get("file.txt"));