上一篇
如何在Java中将数据存储到文件?
- 后端开发
- 2025-06-02
- 4651
在Java中可使用FileOutputStream、FileWriter或Files工具类写入数据,通过创建文件流对象,调用write()方法写入字节/字符数据,最后必须关闭流释放资源,FileWriter写入字符串后执行flush()和close()确保数据持久化保存到磁盘文件。
使用 FileWriter(简单文本写入)
适合快速写入小型文本文件,但需手动处理异常和资源关闭。
import java.io.FileWriter; import java.io.IOException; public class FileWriterExample { public static void main(String[] args) { String data = "Hello, Java文件存储!"; try (FileWriter writer = new FileWriter("output.txt")) { writer.write(data); // 写入字符串 System.out.println("数据写入成功!"); } catch (IOException e) { e.printStackTrace(); } } }
注意:
- 默认覆盖文件内容,追加内容需用
new FileWriter("output.txt", true)
。 - 不支持指定编码(默认使用系统编码),中文可能乱码。
使用 BufferedWriter(高效文本写入)
通过缓冲区提升写入效率,适合大文件或频繁写入操作。
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class BufferedWriterExample { public static void main(String[] args) { String data = "Line 1nLine 2nLine 3"; try (BufferedWriter writer = new BufferedWriter(new FileWriter("buffered.txt"))) { writer.write(data); // 写入多行文本 writer.newLine(); // 插入换行符 writer.append("追加内容"); } catch (IOException e) { e.printStackTrace(); } } }
优势:
- 减少磁盘I/O次数,性能优于
FileWriter
。 - 提供
newLine()
方法跨平台换行。
使用 PrintWriter(格式化写入)
支持格式化输出(如println
、printf
),是控制台输出的文件版。
import java.io.PrintWriter; public class PrintWriterExample { public static void main(String[] args) { try (PrintWriter writer = new PrintWriter("print.txt")) { writer.println("姓名: Alice"); // 自动换行 writer.printf("年龄: %d岁", 25); // 格式化输出 } catch (Exception e) { e.printStackTrace(); } } }
特点:
- 不会抛出
IOException
,需用checkError()
检查错误。 - 支持任意数据类型(自动调用
toString()
)。
使用 FileOutputStream(二进制数据写入)
适合非文本文件(如图片、音频)或指定编码写入。
import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamExample { public static void main(String[] args) { byte[] binaryData = {65, 66, 67, 68}; // ASCII: A,B,C,D try (FileOutputStream fos = new FileOutputStream("binary.bin")) { fos.write(binaryData); // 写入字节数组 } catch (IOException e) { e.printStackTrace(); } } }
文本写入技巧:
配合BufferedOutputStream
提升效率,或转为字节数组写入:
String text = "二进制文本示例"; byte[] bytes = text.getBytes("UTF-8"); // 指定编码 fos.write(bytes);
使用 Files(Java 7+ 简化操作)
推荐方法!简洁安全,一行代码完成写入。
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 FilesExample { public static void main(String[] args) { try { // 写入字符串 Files.writeString(Paths.get("files.txt"), "Java NIO Rocks!"); // 追加多行内容 List<String> lines = Arrays.asList("Line A", "Line B"); Files.write( Paths.get("files.txt"), lines, StandardOpenOption.APPEND // 追加模式 ); } catch (Exception e) { e.printStackTrace(); } } }
优势:
- 自动管理资源,无需
try-catch
(Java 10+的writeString
)。 - 支持选项:
CREATE
(新建)、TRUNCATE_EXISTING
(清空)等。
关键注意事项
-
异常处理:
- 务必用
try-with-resources
(如示例所示),自动关闭资源,避免内存泄漏。 - 捕获
IOException
,处理磁盘满、权限不足等异常。
- 务必用
-
文件路径:
- 相对路径基于项目根目录(IDE中可能是项目文件夹)。
- 绝对路径示例:
Paths.get("C:/data/output.txt")
(Windows)。
-
字符编码:
- 指定编码避免乱码(尤其是中文):
// 使用OutputStreamWriter指定UTF-8 new BufferedWriter(new OutputStreamWriter(new FileOutputStream("file.txt"), StandardCharsets.UTF_8));
Files.write()
默认UTF-8。
- 指定编码避免乱码(尤其是中文):
-
性能优化:
- 大文件用
BufferedWriter
或BufferedOutputStream
。 - 批量写入减少I/O次数(如集合
List<String>
)。
- 大文件用
方法对比与选择
方法 | 适用场景 | 特点 |
---|---|---|
FileWriter |
简单短文本 | 简单易用,无缓冲区 |
BufferedWriter |
大文本或频繁写入 | 缓冲区提升性能,支持换行 |
PrintWriter |
格式化输出(如日志) | 支持print /println /printf |
FileOutputStream |
二进制文件或自定义编码 | 处理字节数据 |
Files |
Java 7+项目 | 代码简洁,功能全面 |
根据需求选择合适方法:
- 快速小文本 →
FileWriter
或Files.writeString()
。 - 大文件/性能优先 →
BufferedWriter
。 - 格式化文本 →
PrintWriter
。 - 二进制数据 →
FileOutputStream
。 - 现代简洁方案 →
Files
类(首选)。
引用说明:
- Oracle官方文档:Java I/O
- Java NIO包文档:java.nio.file
- 字符编码规范:UTF-8