IO操作常用写法
IO操作是程序中常见的操作,正确的IO处理可以避免资源泄漏。本文详细介绍IO操作的常用写法和最佳实践。
📋 目录
🎯 一、文件读写
1.1 文件读取
使用Files类(Java 7+):
java
import java.nio.file.Files;
import java.nio.file.Paths;
// 读取文件所有内容
byte[] bytes = Files.readAllBytes(Paths.get("file.txt"));
String content = new String(bytes, StandardCharsets.UTF_8);
// 读取所有行
List<String> lines = Files.readAllLines(Paths.get("file.txt"), StandardCharsets.UTF_8);
// 按行读取(流式)
Files.lines(Paths.get("file.txt"), StandardCharsets.UTF_8)
.forEach(line -> System.out.println(line));
// 使用BufferedReader
try (BufferedReader reader = Files.newBufferedReader(Paths.get("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}使用传统IO:
java
// 使用FileInputStream
try (FileInputStream fis = new FileInputStream("file.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(isr)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
// 使用Scanner
try (Scanner scanner = new Scanner(new File("file.txt"))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
}1.2 文件写入
使用Files类:
java
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
// 写入字符串
String content = "Hello World";
Files.write(Paths.get("output.txt"), content.getBytes(StandardCharsets.UTF_8));
// 追加内容
Files.write(Paths.get("output.txt"), content.getBytes(),
StandardOpenOption.APPEND);
// 写入多行
List<String> lines = Arrays.asList("line1", "line2", "line3");
Files.write(Paths.get("output.txt"), lines, StandardCharsets.UTF_8);
// 使用BufferedWriter
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get("output.txt"), StandardCharsets.UTF_8)) {
writer.write("Hello");
writer.newLine();
writer.write("World");
}使用传统IO:
java
// 使用FileOutputStream
try (FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(osw)) {
writer.write("Hello World");
writer.newLine();
}
// 使用PrintWriter
try (PrintWriter writer = new PrintWriter(
new FileWriter("output.txt", StandardCharsets.UTF_8))) {
writer.println("Hello");
writer.println("World");
}🎯 二、文件操作
2.1 文件复制
文件复制:
java
// 使用Files.copy
Files.copy(
Paths.get("source.txt"),
Paths.get("dest.txt"),
StandardCopyOption.REPLACE_EXISTING
);
// 使用流复制(大文件)
try (InputStream is = Files.newInputStream(Paths.get("source.txt"));
OutputStream os = Files.newOutputStream(Paths.get("dest.txt"))) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
}
// 使用Files.copy(流式,适合大文件)
try (InputStream is = Files.newInputStream(Paths.get("source.txt"));
OutputStream os = Files.newOutputStream(Paths.get("dest.txt"))) {
is.transferTo(os); // Java 9+
}2.2 文件移动和删除
文件操作:
java
// 移动文件
Files.move(
Paths.get("old.txt"),
Paths.get("new.txt"),
StandardCopyOption.REPLACE_EXISTING
);
// 删除文件
Files.delete(Paths.get("file.txt"));
Files.deleteIfExists(Paths.get("file.txt")); // 不存在不抛异常
// 删除目录(递归)
Files.walk(Paths.get("dir"))
.sorted(Comparator.reverseOrder())
.forEach(path -> {
try {
Files.delete(path);
} catch (IOException e) {
// 处理异常
}
});🎯 三、资源管理
3.1 try-with-resources
自动资源管理:
java
// 单个资源
try (FileInputStream fis = new FileInputStream("file.txt")) {
// 使用资源
} // 自动关闭
// 多个资源
try (
FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")
) {
// 使用资源
} // 按相反顺序自动关闭
// 自定义资源
try (MyResource resource = new MyResource()) {
// 使用资源
}
// MyResource必须实现AutoCloseable接口3.2 资源管理最佳实践
资源管理示例:
java
// ✅ 好的做法:使用try-with-resources
public String readFile(String fileName) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(
Paths.get(fileName), StandardCharsets.UTF_8)) {
return reader.lines().collect(Collectors.joining("\n"));
}
}
// ❌ 不好的做法:手动管理资源
public String readFile(String fileName) throws IOException {
BufferedReader reader = Files.newBufferedReader(
Paths.get(fileName), StandardCharsets.UTF_8);
// 如果中间抛出异常,资源可能无法关闭
return reader.lines().collect(Collectors.joining("\n"));
}🎯 四、字符流操作
4.1 Reader和Writer
字符流使用:
java
// 使用FileReader
try (FileReader reader = new FileReader("file.txt", StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(reader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
// 使用FileWriter
try (FileWriter writer = new FileWriter("output.txt", StandardCharsets.UTF_8);
BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
bufferedWriter.write("Hello");
bufferedWriter.newLine();
bufferedWriter.write("World");
}🎯 五、字节流操作
5.1 InputStream和OutputStream
字节流使用:
java
// 使用FileInputStream
try (FileInputStream fis = new FileInputStream("file.bin");
BufferedInputStream bis = new BufferedInputStream(fis)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
// 处理数据
processBytes(buffer, bytesRead);
}
}
// 使用FileOutputStream
try (FileOutputStream fos = new FileOutputStream("output.bin");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
byte[] data = "Hello World".getBytes(StandardCharsets.UTF_8);
bos.write(data);
}📖 学习资源
官方文档
✅ 学习检查清单
- [ ] 已掌握文件读写操作
- [ ] 已掌握流操作
- [ ] 已了解资源管理方法
- [ ] 已熟悉字符流和字节流