
本文详解如何在java中将字符串数组内容以可读格式写入文件,避免出现[ljava.lang.string;@xxxxxx这类无意义的内存地址表示,并强调资源管理与api正确用法。
在Java中,直接对数组调用 println()(如 pw.println(arr))会触发其继承自 Object 的 toString() 方法,返回形如 [Ljava.lang.String;@51d5f7fd 的内部标识符——这是数组的类名+哈希码,并非实际元素内容。要输出人类可读的数组结构(如 [apple, banana, cherry]),必须借助 java.util.Arrays 提供的工具方法。
✅ 正确做法:使用 Arrays.toString()
Arrays.toString(String[]) 会将数组元素按逗号分隔、包裹在方括号中,生成标准字符串表示。修改你的代码只需两处关键调整:
-
导入工具类(若尚未导入):
import java.util.Arrays;
替换 pw.println(arr) 为 pw.println(Arrays.toString(arr)),并将 PrintWriter 的关闭逻辑移出循环(否则仅写入第一行后流即关闭,后续写入失败或被静默丢弃)。
以下是优化后的完整代码段(含异常处理与资源自动管理):
import java.io.*;
import java.util.Arrays;
// ... 在你的方法内 ...
try (BufferedReader br = new BufferedReader(new FileReader("C:\\rd\\bubble.txt"));
PrintWriter pw = new PrintWriter(new File("C:\\rd\\bubble_out.txt"))) {
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split("\\s+"); // 按一个或多个空白字符分割
if (arr.length > 0) { // 防空数组越界
System.out.println(arr[arr.length - 1]); // 控制台输出最后一个元素
pw.println(Arrays.toString(arr)); // 文件写入完整数组(可读格式)
}
}
// ✅ try-with-resources 自动关闭 br 和 pw,无需手动调用 close()
} catch (IOException e) {
System.err.println("文件操作异常: " + e.getMessage());
}⚠️ 注意事项与最佳实践
- 不要在循环内关闭流:原代码中 pw.close() 位于 while 循环内,导致第一次迭代后 PrintWriter 关闭,后续 pw.println() 将抛出 IllegalStateException 或静默失败。
- 优先使用 try-with-resources:它确保即使发生异常,流也会被自动、安全地关闭,大幅提升代码健壮性。
- 防御性检查:arr.length > 0 可避免空行或纯空白行导致 ArrayIndexOutOfBoundsException。
- 替代方案(如需自定义格式):若不希望方括号和引号(例如只要 apple,banana,cherry),可用 String.join(",", arr);但 Arrays.toString() 是最通用、语义最清晰的选择。
通过以上调整,你的输出文件 bubble_out.txt 将清晰显示每行解析后的字符串数组,例如:
[Hello, World, Java] [foo, bar] [test, 123, done]
而非不可读的内存地址。这既是Java数组序列化的基础常识,也是生产级文件I/O的必备实践。










