Java中文件读写操作:FileReader和FileWriter

文件处理是编程的一个基本方面,Java 提供了强大的 API 来操作文件。

FileReader
在 Java 中从文件读取数据时,“FileReader”类是一个关键角色。通过 10 个不同的代码示例探索 FileReader 类及其各种功能。

例 1:基本文件阅读器初始化

import java.io.FileReader;
import java.io.IOException;

public class Example1 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt")) {
            int character;
            while ((character = fileReader.read()) != -1) {
                System.out.print((char) character);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:本例演示如何初始化一个 `FileReader` 并使用其 `read()` 方法从文件中读取字符。

例 2:将字符读入字符数组

import java.io.FileReader;
import java.io.IOException;

public class Example2 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt")) {
            char[] buffer = new char[1024];
            int bytesRead;
            while ((bytesRead = fileReader.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, bytesRead));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:在这个示例中,我们将字符读入一个 char 数组,以有效处理较大的数据块。

例 3:使用 BufferedReader 和 FileReader

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Example3 {
    public static void main(String[] args) {
        try (BufferedReader bufferedReader = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:在这里,我们引入了 `BufferedReader` 来从文件中读取行数,从而提高性能。

例 4:带有资源尝试功能的文件阅读器

import java.io.FileReader;
import java.io.IOException;

public class Example4 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt")) {
           
// File reading logic here
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:演示了如何使用 try-with-resources 自动关闭文件阅读器。

例 5:使用 skip()

import java.io.FileReader;
import java.io.IOException;

public class Example5 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt")) {
            fileReader.skip(5);
// Skip the first 5 characters
           
// Continue with the reading logic
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:说明使用 `skip()` 方法跳过指定数量的字符。

例 6:使用自定义字符集的文件阅读器

import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class Example6 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt", StandardCharsets.UTF_8)) {
           
// File reading logic here
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:显示如何在创建文件阅读器时指定自定义字符集。

例 7:二进制数据的文件阅读器

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;

public class Example7 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader(new FileInputStream("binaryFile.bin"))) {
           
// File reading logic for binary data
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:演示如何使用`FileReader`和`FileInputStream`读取二进制数据。

例 8:带有标记和重置功能的文件阅读器

import java.io.FileReader;
import java.io.IOException;

public class Example8 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt")) {
            if (fileReader.markSupported()) {
                fileReader.mark(10);
// Mark the current position
               
// Continue with the reading logic
                fileReader.reset();
// Reset to the marked position
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:介绍用于设置和返回标记位置的 `mark()` 和 `reset()` 方法。

例 9:处理 FileNotFound 异常

import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;

public class Example9 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("nonexistentFile.txt")) {
           
// File reading logic here
        } catch (FileNotFoundException e) {
            System.err.println(
"File not found: " + e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:演示如何在尝试读取不存在的文件时处理 "FileNotFoundException"。

例 10:资源文件的文件阅读器

import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Example10 {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader(
                new InputStreamReader(Example10.class.getResourceAsStream("/resourceFile.txt")))) {
           
// File reading logic for resource files
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:展示如何使用 `FileReader` 从 classpath 中的资源文件读取数据。

FileWriter 类
它是一个用 Java 将字符数据写入文件的便捷工具。我们将通过 10 个不同的代码示例探索其功能,每个示例都突出显示 FileWriter 的一个特定方面。

1.FileWriter 的基本用法

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample1 {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("output.txt");
            writer.write(
"Hello, FileWriter!");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个简单的示例演示了如何创建 FileWriter 对象、将字符串写入文件(本例中为 "output.txt")并关闭 writer。​​​​​​​

2.具有追加模式的 FileWriter


import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample2 {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("output.txt", true);
            writer.write(
"\nAppending text.");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

通过传递 `true` 作为第二个参数,FileWriter 将被设置为追加模式。它会将内容追加到现有文件,而不是覆盖现有文件。


3.将字符数组写入文件


import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample3 {
    public static void main(String[] args) {
        try {
            char[] charArray = {'H', 'e', 'l', 'l', 'o'};
            FileWriter writer = new FileWriter("output.txt");
            writer.write(charArray);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该示例展示了如何使用 `write` 方法将字符数组写入文件。


4.FileWriter 与 BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample4 {
    public static void main(String[] args) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
            writer.write("Using BufferedWriter with FileWriter.");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用 BufferedWriter 可以减少磁盘写入次数,从而提高性能。

5. FileWriter with AutoFlush

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class FileWriterExample5 {
    public static void main(String[] args) {
        try {
            PrintWriter writer = new PrintWriter(new FileWriter("output.txt"), true);
            writer.println(
"AutoFlush is enabled.");
            writer.println(
"New line with AutoFlush.");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

PrintWriter "类允许您启用自动刷新,确保数据立即写入文件。


6.使用自定义字符集的 FileWriter

import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class FileWriterExample6 {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("output.txt", StandardCharsets.UTF_8);
            writer.write("Writing with custom character set (UTF-8).");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

您可以在创建 FileWriter 时指定字符集编码。

7.带有 FileLock 的 FileWriter


import java.io.FileWriter;
import java.io.IOException;
import java.nio.channels.FileLock;

public class FileWriterExample7 {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("output.txt");
            FileLock lock = writer.getChannel().lock();
            writer.write(
"Writing with FileLock.");
            lock.release();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用 "FileLock "有助于防止对同一文件的并发写入访问。

8.带有 Try-With-Resources 的 FileWriter

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample8 {
    public static void main(String[] args) {
        try (FileWriter writer = new FileWriter("output.txt")) {
            writer.write(
"Using try-with-resources for FileWriter.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

利用 try-with-resources 可确保 FileWriter 自动关闭。

9.文件写入器异常处理

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterExample9 {
    public static void main(String[] args) {
        FileWriter writer = null;
        try {
            writer = new FileWriter("output.txt");
            writer.write(
"Handling exceptions explicitly.");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

明确的异常处理可确保即使在出现异常的情况下也能进行适当的资源清理。

10.带路径的 FileWriter

import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileWriterExample10 {
    public static void main(String[] args) {
        Path filePath = Paths.get("output.txt");
        try {
            FileWriter writer = new FileWriter(filePath.toFile());
            writer.write(
"Using FileWriter with Path.");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

您可以使用 "Path "对象创建 FileWriter,为处理文件路径提供更多灵活性。