fileoutputstream写入变量需转字节数组,覆盖由构造参数控制:不传或false为覆盖,true为追加;须指定utf-8避免乱码,用try-with-resources关闭流;非字符串类型需转换或包装。
直接用 fileoutputstream 写入变量数据时,关键在于把变量转成字节数组(如字符串调用 getbytes()),并明确控制是否覆盖文件——这由构造方法的第二个布尔参数决定。
写入字符串变量并覆盖原文件
默认行为是覆盖:不传第二个参数,或传 false,会清空原文件再写入新内容。
String content = "用户名:张三,登录时间:2024-06-15";
try (FileOutputStream fos = new FileOutputStream("user.log")) {
fos.write(content.getBytes(StandardCharsets.UTF_8));
}
注意指定字符集(如 UTF_8),避免中文乱码;使用 try-with-resources 自动关闭流。
追加写入变量数据(不覆盖)
若想在文件末尾添加内容(比如日志记录),构造时传 true:
String logEntry = "[INFO] 操作成功\n";
try (FileOutputStream fos = new FileOutputStream("app.log", true)) {
fos.write(logEntry.getBytes(StandardCharsets.UTF_8));
}
每次执行都会追加,不会擦除已有内容;换行符 \n 要手动加,否则所有日志挤在同一行。
先判断文件是否存在再决定覆盖策略
业务中常需“存在则备份,再覆盖”或“存在则拒绝写入”。可用 Files.exists() 预检:
- 存在则重命名原文件(如加
.bak后缀),再新建写入 - 存在则跳过写入,或抛出自定义异常提示用户
- 用
StandardOpenOption.CREATE_NEW配合Files.newOutputStream()实现“仅新建”,避免误覆盖
例如安全覆盖写法:
Path path = Paths.get("config.dat");
if (Files.exists(path)) {
Files.move(path, path.resolveSibling("config.dat.bak"),
StandardCopyOption.REPLACE_EXISTING);
}
try (FileOutputStream fos = new FileOutputStream("config.dat")) {
fos.write(configJson.getBytes(StandardCharsets.UTF_8));
}
写入非字符串变量(如 int、double)的处理方式
FileOutputStream 只接受 byte[] 或单个 int(低8位),不能直接写基本类型。常用做法:
- 转字符串再编码:
String.valueOf(num).getBytes() - 用
DataOutputStream包装(支持writeInt()、writeDouble()等),但需配套用DataInputStream读取 - 序列化对象需用
ObjectOutputStream,且类必须实现Serializable
简单数值推荐第一种,清晰可控;二进制协议场景才用 DataOutputStream。











