如何将字符串数组正确输出至文件?解决打印对象地址问题
问题解决:Java输出数组内容到文件而非对象地址
核心问题原因
你直接调用pw.println(arr)时,Java会使用数组默认的toString()方法(继承自Object类),输出格式就是[Ljava.lang.String;@xxxxxx这种对象标识,而非数组的实际内容。另外你的代码还有两个隐藏问题:
pw.close()放在while循环内部,第一次循环就会关闭输出流,后续所有内容都无法写入文件if(file.exists()) { file.createNewFile(); }逻辑错误,应该是文件不存在时才创建,且其实PrintWriter会自动创建不存在的文件,这部分代码可以简化
解决方案
方案1:输出数组最后一个元素(和控制台保持一致)
把文件输出的代码改成和控制台一样,直接打印数组的最后一个元素,同时修正流关闭的位置:
import java.io.BufferedReader; import java.io.FileReader; import java.io.File; import java.io.PrintWriter; import java.io.IOException; public class FileProcessor { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("C:\\rd\\bubble.txt")); File file = new File("C:\\rd\\bubble_out.txt"); PrintWriter pw = new PrintWriter(file); String line; while ((line = br.readLine()) != null) { String[] arr = line.split("\\s+"); String lastElement = arr[arr.length - 1]; System.out.println(lastElement); pw.println(lastElement); // 输出最后一个元素而非数组对象 } pw.close(); // 循环结束后再关闭流 br.close(); } catch (IOException x) { System.out.println("文件操作异常: " + x.getMessage()); } } }
方案2:输出整个数组的内容
如果需要输出整个数组的字符串形式(比如[元素1, 元素2, 元素3]),需要使用java.util.Arrays工具类的toString()方法,记得导入该类:
import java.io.BufferedReader; import java.io.FileReader; import java.io.File; import java.io.PrintWriter; import java.io.IOException; import java.util.Arrays; // 导入Arrays类 public class FileProcessor { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("C:\\rd\\bubble.txt")); PrintWriter pw = new PrintWriter("C:\\rd\\bubble_out.txt"); // 直接传入路径简化代码 String line; while ((line = br.readLine()) != null) { String[] arr = line.split("\\s+"); System.out.println(arr[arr.length - 1]); pw.println(Arrays.toString(arr)); // 使用Arrays.toString转换数组为字符串 } pw.close(); br.close(); } catch (IOException x) { System.out.println("文件操作异常: " + x.getMessage()); } } }
更简便的实现方式(Java 8+)
使用Files.lines配合流操作,可以大幅简化代码,无需手动管理流:
import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; import java.util.stream.Collectors; public class FileProcessor { public static void main(String[] args) { try { // 读取文件每行,提取最后一个元素,收集为字符串并写入输出文件 String result = Files.lines(Paths.get("C:\\rd\\bubble.txt")) .map(line -> line.split("\\s+")) .map(arr -> arr[arr.length - 1]) .collect(Collectors.joining(System.lineSeparator())); Files.write(Paths.get("C:\\rd\\bubble_out.txt"), result.getBytes()); // 控制台输出可以单独处理,或者直接打印result System.out.println(result); } catch (IOException x) { System.out.println("文件操作异常: " + x.getMessage()); } } }
这个方式利用Java流API,自动处理流的打开和关闭,代码更简洁易读。
内容的提问来源于stack exchange,提问作者MajorMike
相关产品推荐
相关产品推荐

