如何在将ArrayList写入文件时用 分隔字段?
如何修正ArrayList写入文件时的制表符分隔问题?
我程序里这段把ArrayList写入文件的代码,原本想让内容用制表符\t分隔成规整的表格样式,但实际输出不符合预期,该怎么调整呢?
我的代码示例:
try { FileWriter fw = new FileWriter(file); Writer output = new BufferedWriter(fw); int counter = list.size(); for (int i = 0; i < counter+1; i++) { if (i == 0) { output.write("ProductID " + "ProductName " + "SupplierID " + "CategoryID " + "Unit " + "Price " + "Amount" + System.lineSeparator()); } else { output.write(list.get(i-1).toString() + "\t" + antalVaror.get(i-1) + System.lineSeparator()); } } output.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
问题分析&修正方案
你看哈,现在的问题主要出在表头和内容的分隔符不统一,还有循环逻辑可以优化得更清晰:
- 表头用制表符替换空格:原来的表头是用空格分隔的,这就导致表头和后面用
\t分隔的内容对齐乱掉了,把表头里的空格全换成\t就行。 - 优化循环逻辑:原来的循环把表头和内容混在一起处理,其实可以分开写——先写入表头,再单独循环遍历列表写入内容,这样代码可读性更高,也不容易出错。
- 用try-with-resources管理资源:原来的写法如果抛出异常可能会导致流没关闭,用try-with-resources能自动帮你关闭流,更安全健壮。
修正后的完整代码
try (BufferedWriter output = new BufferedWriter(new FileWriter(file))) { // 表头用制表符分隔 output.write("ProductID\tProductName\tSupplierID\tCategoryID\tUnit\tPrice\tAmount" + System.lineSeparator()); // 循环写入内容,确保每个字段用制表符分隔 for (int i = 0; i < list.size(); i++) { output.write(list.get(i).toString() + "\t" + antalVaror.get(i) + System.lineSeparator()); } } catch (IOException e) { e.printStackTrace(); }
额外提示
如果list.get(i).toString()本身输出的内容里包含空格或者制表符,可能还会影响对齐,要是想更规整,可以考虑用String.format来固定每个字段的宽度,比如:
output.write(String.format("%-10s\t%-15s\t%-10s\t%-10s\t%-8s\t%-6s\t%-6s%n", "ProductID", "ProductName", "SupplierID", "CategoryID", "Unit", "Price", "Amount")); // 内容也对应调整格式 output.write(String.format("%-10s\t%-15s\t%-10d\t%-10d\t%-8s\t%-6.2f\t%-6d%n", list.get(i).getProductID(), list.get(i).getProductName(), list.get(i).getSupplierID(), list.get(i).getCategoryID(), list.get(i).getUnit(), list.get(i).getPrice(), antalVaror.get(i)));
这样输出的表格会更整齐,不过前提是你能拿到对象的单个字段,而不是直接用toString()。
内容的提问来源于stack exchange,提问作者Zaid Al-nuaimi
相关产品推荐
相关产品推荐

