Java中文件读写核心是I/O流,常用BufferedReader/Writer、Scanner、Files工具类;处理大文件需流式读取避免内存溢出,推荐Files.lines()结合Stream;路径处理应使用Paths.get()确保跨平台兼容;文件操作优先选用java.nio.file.Files实现创建、删除、复制和移动。

Java中读写本地文件内容,核心在于理解I/O流的概念,并善用
java.io
java.nio.file
在Java中进行文件读写,我们通常会用到以下几种方式,它们各有侧重,但目标都是一样的:把数据从文件里拿出来,或者把数据放进去。
读文件内容:
我个人在处理文本文件时,最常用的还是
BufferedReader
FileReader
立即学习“Java免费学习笔记(深入)”;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;
public class FileReadWriteExample {
public static void readFileWithBufferedReader(String filePath) {
// try-with-resources 确保流自动关闭,这是Java里处理资源的好习惯
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
System.out.println("--- 使用 BufferedReader 读取文件 ---");
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件时发生错误: " + e.getMessage());
// 实际应用中,这里可能需要更详细的错误日志或异常处理策略
}
}
public static void readFileWithScanner(String filePath) {
try (Scanner scanner = new Scanner(new FileReader(filePath))) {
System.out.println("\n--- 使用 Scanner 读取文件 ---");
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (IOException e) {
System.err.println("读取文件时发生错误: " + e.getMessage());
}
}
public static void readFileWithFilesReadAllLines(String filePath) {
try {
System.out.println("\n--- 使用 Files.readAllLines 读取文件 ---");
// 注意:Files.readAllLines 适合小文件,因为它会一次性把所有行加载到内存
List<String> lines = Files.readAllLines(Paths.get(filePath));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件时发生错误: " + e.getMessage());
}
}
}写文件内容:
写入文件,我同样偏爱
BufferedWriter
PrintWriter
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;
public class FileWriteExample {
public static void writeFileWithBufferedWriter(String filePath, String content, boolean append) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, append))) {
System.out.println("\n--- 使用 BufferedWriter 写入文件 ---");
writer.write(content);
writer.newLine(); // 写入一个换行符
writer.write("这是新的一行。");
System.out.println("内容已写入到 " + filePath);
} catch (IOException e) {
System.err.println("写入文件时发生错误: " + e.getMessage());
}
}
public static void writeFileWithPrintWriter(String filePath, String content, boolean append) {
try (PrintWriter writer = new PrintWriter(new FileWriter(filePath, append))) {
System.out.println("\n--- 使用 PrintWriter 写入文件 ---");
writer.println(content); // println 会自动添加换行符
writer.printf("数字: %d, 字符串: %s%n", 123, "测试"); // 支持格式化输出
System.out.println("内容已写入到 " + filePath);
} catch (IOException e) {
System.err.println("写入文件时发生错误: " + e.getMessage());
}
}
public static void writeFileWithFilesWrite(String filePath, List<String> lines, boolean append) {
try {
System.out.println("\n--- 使用 Files.write 写入文件 ---");
// StandardOpenOption.APPEND 表示追加模式,CREATE 表示如果文件不存在则创建
// 如果不指定 APPEND,默认是覆盖模式
Files.write(Paths.get(filePath), lines, append ? StandardOpenOption.APPEND : StandardOpenOption.CREATE);
System.out.println("内容已写入到 " + filePath);
} catch (IOException e) {
System.err.println("写入文件时发生错误: " + e.getMessage());
}
}
public static void main(String[] args) {
String testFilePath = "my_test_file.txt";
String contentToWrite = "Hello, Java file operations!";
List<String> linesToWrite = Arrays.asList("Line 1 from Files.write", "Line 2 from Files.write");
// 写入操作
writeFileWithBufferedWriter(testFilePath, contentToWrite, false); // 覆盖写入
writeFileWithPrintWriter(testFilePath, "这是一段用PrintWriter写入的内容。", true); // 追加写入
writeFileWithFilesWrite(testFilePath, linesToWrite, true); // 追加写入
// 读取操作
readFileWithBufferedReader(testFilePath);
readFileWithScanner(testFilePath);
readFileWithFilesReadAllLines(testFilePath);
}
}上面这些代码片段,基本上涵盖了Java文件读写最常用的几种姿势。特别要注意
try-with-resources
处理大文件时,最怕的就是内存溢出(OutOfMemoryError)。我个人就遇到过好几次,尤其是在用
Files.readAllLines()
避免内存溢出的核心策略:
BufferedReader
Scanner
Files.lines()
Stream<String>
示例:使用Files.lines()
doxygen是一款好用的程序员辅助工具,它可以让程序添加批添代码更加简单轻松,兼容C++、 C、Java、 Objective-C、Python等主流编程语言,小编提供的doxygen中文手册包含了基本介绍、语法技巧以及进阶技巧等内容,可以让你快速上手操作,有需要的欢迎下载。 基本介绍 Doxygen已经支持生成ANSI编码的chm目录文件(index.hhc)!Doxygen通常是用作生成英文文档的,生成中文文档需要修改输入和输出的码制,这样可以改变解析方式,生成中文文档。但是,你必须意识 到,Dox
0
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Stream;
public class LargeFileReader {
public static void processLargeFileWithStream(String filePath) {
System.out.println("\n--- 使用 Files.lines() 处理大文件 ---");
AtomicLong lineCount = new AtomicLong(0); // 用于计数,确保不是一次性加载
try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
lines.forEach(line -> {
// 这里可以对每一行进行处理,比如解析、过滤、转换等
// System.out.println("处理行: " + line); // 实际处理时可能不会打印,以防控制台输出过多
lineCount.incrementAndGet();
if (lineCount.get() % 100000 == 0) { // 每处理10万行打印一次进度
System.out.println("已处理 " + lineCount.get() + " 行...");
}
});
System.out.println("文件处理完毕,总行数: " + lineCount.get());
} catch (IOException e) {
System.err.println("处理大文件时发生错误: " + e.getMessage());
}
}
public static void main(String[] args) {
// 假设有一个很大的文件 large_data.txt
// 为了演示,我们先创建一个模拟的大文件
String largeFilePath = "large_data.txt";
createMockLargeFile(largeFilePath, 1000000); // 创建一个包含100万行的大文件
processLargeFileWithStream(largeFilePath);
}
// 辅助方法:创建一个模拟的大文件
private static void createMockLargeFile(String filePath, int lines) {
System.out.println("正在创建模拟大文件 " + filePath + ",包含 " + lines + " 行...");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (int i = 0; i < lines; i++) {
writer.write("This is line number " + (i + 1) + " of the large file.");
writer.newLine();
}
System.out.println("模拟大文件创建完成。");
} catch (IOException e) {
System.err.println("创建模拟大文件时发生错误: " + e.getMessage());
}
}
}Files.lines()
Stream
文件路径这东西,看着简单,坑可不少。我个人就经常在Windows和Linux之间切换开发环境,每次都要特别注意路径分隔符的问题。Windows用反斜杠
\
/
常见陷阱:
C:\Users\John\file.txt
确保跨平台兼容性的策略:
java.nio.file.Paths
Path
Paths.get("dir", "subdir", "file.txt")Path.resolve()
Path.normalize()
..
.
File.separator
java.io.File
File.separator
Paths.get()
System.getProperty("user.dir")示例:跨平台路径处理
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilePathCompatibility {
public static void main(String[] args) {
// 1. 使用 File.separator (老方法,但仍可用)
String fileName = "my_document.txt";
String dirName = "data";
String fullPathOld = dirName + File.separator + fileName;
System.out.println("使用 File.separator 构建的路径: " + fullPathOld);
System.out.println("当前系统路径分隔符: '" + File.separator + "'");
// 2. 推荐:使用 java.nio.file.Paths
Path path = Paths.get("reports", "2023", "summary.csv");
System.out.println("\n使用 Paths.get() 构建的路径: " + path);
Path anotherPath = Paths.get("/home", "user", "documents"); // 绝对路径
System.out.println("使用 Paths.get() 构建的绝对路径: " + anotherPath);
// 拼接路径
Path baseDir = Paths.get("temp");
Path finalPath = baseDir.resolve("logs").resolve("app.log");
System.out.println("使用 resolve() 拼接的路径: " + finalPath);
// 规范化路径 (处理 .. 和 .)
Path unnormalizedPath = Paths.get("/a/./b/../c");
Path normalizedPath = unnormalizedPath.normalize();
System.out.println("非规范化路径: " + unnormalizedPath);
System.out.println("规范化路径: " + normalizedPath);
// 3. 获取当前工作目录
String userDir = System.getProperty("user.dir");
System.out.println("\n当前用户工作目录: " + userDir);
Path relativePathFromUserDir = Paths.get(userDir, "config", "settings.properties");
System.out.println("基于用户工作目录的相对路径: " + relativePathFromUserDir);
// 检查文件是否存在
File someFile = new File(fullPathOld);
if (someFile.exists()) {
System.out.println(fullPathOld + " 存在。");
} else {
System.out.println(fullPathOld + " 不存在。");
}
}
}总的来说,尽量拥抱
java.nio.file
除了读写文件内容,文件系统本身的结构操作也同样重要。比如,程序运行时可能需要创建日志目录,或者在处理完文件后将其移动到存档目录。
java.io.File
java.nio.file.Files
Files
文件和目录操作:
Files.createFile(Path path)
FileAlreadyExistsException
Files.createDirectory(Path dir)
NoSuchFileException
Files.createDirectories(Path dir)
Files.delete(Path path)
Files.deleteIfExists(Path path)
Files.copy(Path source, Path target, CopyOption... options)
options
StandardCopyOption.REPLACE_EXISTING
StandardCopyOption.COPY_ATTRIBUTES
Files.move(Path source, Path target, CopyOption... options)
options
StandardCopyOption.REPLACE_EXISTING
示例:文件和目录操作
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class FileDirectoryOperations {
public static void main(String[] args) {
Path baseDir = Paths.get("my_app_data");
Path subDir = baseDir.resolve("logs");
Path file1 = subDir.resolve("app_log.txt");
Path file2 = subDir.resolve("error_log.txt");
Path copiedFile = Paths.get("copied_app_log.txt");
Path movedFile = Paths.get("moved_error_log.txt");
try {
// 1. 创建目录
System.out.println("--- 创建目录 ---");
if (!Files.exists(baseDir)) {
Files.createDirectory(baseDir); // 创建my_app_data
System.out.println("目录 " + baseDir + " 已创建。");
}
if (!Files.exists(subDir)) {
Files.createDirectories(subDir); // 创建my_app_data/logs,即使my_app_data不存在也会一并创建
System.out.println("目录 " + subDir + " 已创建。");
}
// 2. 创建文件
System.out.println("\n--- 创建文件 ---");
if (!Files.exists(file1)) {
Files.createFile(file1);
System.out.println("文件 " + file1 + " 已创建。");
}
if (!Files.exists(file2)) {
Files.createFile(file2);
System.out.println("文件 " + file2 + " 已创建。");
}
// 3. 写入一些内容到文件,方便后续操作
Files.write(file1, "这是app日志内容。".getBytes());
Files.write(file2, "这是error日志内容。".getBytes());
// 4. 复制文件
System.out.println("\n--- 复制文件 ---");
// 复制 file1 到 copiedFile,如果目标文件存在则覆盖
Files.copy(file1, copiedFile, StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件 " + file1 + " 已复制到 " + copiedFile);
// 5. 移动/重命名文件
System.out.println("\n--- 移动/重命名文件 ---");
// 移动 file2 到 movedFile,如果目标文件存在则覆盖
Files.move(file2, movedFile, StandardCopyOption.REPLACE_EXISTING);
System.out.println("文件 " + file2 + " 已移动到 " + movedFile);以上就是java如何读写本地文件内容 java文件操作的实用编程技巧的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号