本文目录导读:

- 使用 FileReader / FileWriter(字符流,适合文本文件)
- 使用 FileInputStream / FileOutputStream(字节流,适合二进制文件)
- 使用 Files 工具类(Java 7+,推荐方式)
- 使用 Scanner 类(适合读取格式化的文本文件)
- 完整案例:复制文件
- 选择建议
- 注意事项
在Java中读写本地文件有多种方式,我会从最常用到最进阶给你介绍几个典型案例。
使用 FileReader / FileWriter(字符流,适合文本文件)
写文件示例
import java.io.FileWriter;
import java.io.IOException;
public class WriteFileExample {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write("Hello, World!\n");
writer.write("这是第二行内容");
// 注意:FileWriter默认是覆盖模式,追加内容需使用第二个参数为true
} catch (IOException e) {
e.printStackTrace();
}
}
}
写文件(追加模式)
try (FileWriter writer = new FileWriter("output.txt", true)) {
writer.write("\n这是追加的内容");
}
读文件示例
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class ReadFileExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 FileInputStream / FileOutputStream(字节流,适合二进制文件)
写二进制文件
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteBinaryFile {
public static void main(String[] args) {
byte[] data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello" 的字节
try (FileOutputStream fos = new FileOutputStream("binary.dat")) {
fos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
读二进制文件
import java.io.FileInputStream;
import java.io.IOException;
public class ReadBinaryFile {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("binary.dat")) {
int byteData;
while ((byteData = fis.read()) != -1) {
System.out.printf("%02X ", byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 Files 工具类(Java 7+,推荐方式)
写文件
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
public class FilesWriteExample {
public static void main(String[] args) {
try {
// 写入字符串
Files.write(Paths.get("example.txt"), "Hello, Files!".getBytes());
// 写入多行
List<String> lines = Arrays.asList("第一行", "第二行", "第三行");
Files.write(Paths.get("lines.txt"), lines);
// 追加内容
Files.write(Paths.get("example.txt"), "\n追加的内容".getBytes(),
java.nio.file.StandardOpenOption.APPEND);
} catch (IOException e) {
e.printStackTrace();
}
}
}
读文件
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class FilesReadExample {
public static void main(String[] args) {
try {
// 读取所有内容为字符串
String content = new String(Files.readAllBytes(Paths.get("example.txt")));
System.out.println(content);
// 按行读取
List<String> lines = Files.readAllLines(Paths.get("lines.txt"));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用 Scanner 类(适合读取格式化的文本文件)
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerReadExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("data.txt"))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// 可以按空格分割
String[] parts = line.split(" ");
for (String part : parts) {
System.out.println(part);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
完整案例:复制文件
import java.io.*;
public class FileCopyExample {
public static void copyFile(String source, String dest) throws IOException {
try (FileInputStream fis = new FileInputStream(source);
FileOutputStream fos = new FileOutputStream(dest)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
}
public static void main(String[] args) {
try {
copyFile("source.txt", "destination.txt");
System.out.println("文件复制成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
选择建议
- 文本文件读写:优先使用
Files工具类或BufferedReader/PrintWriter - 二进制文件:使用
FileInputStream/FileOutputStream或Files工具类 - 大文件处理:使用带缓冲的流(如
BufferedInputStream) - 需要随机访问:使用
RandomAccessFile
注意事项
- 资源管理:始终在
try-with-resources语句中使用流,确保资源正确关闭 - 字符编码:明确指定字符编码(如
UTF-8),避免跨平台问题 - 异常处理:正确处理
IOException - 文件路径:注意相对路径和绝对路径的区别
这些是Java中读写文件最常用的方式,根据你的具体需求选择合适的方案即可。