Skip to content

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);
}

📖 学习资源 ​

官方文档 ​

✅ 学习检查清单 ​

  • [ ] 已掌握文件读写操作
  • [ ] 已掌握流操作
  • [ ] 已了解资源管理方法
  • [ ] 已熟悉字符流和字节流

上一章节:异常处理常用写法
下一章节:并发编程常用写法
返回目录:代码规范