我正在编写一种自动提款机程序,该程序会将数据输出到文件中(是的,我知道它不是英语,但这不是重点),并且遇到了错误。
当我尝试使用PrintWriter它不起作用时,我不知道为什么。
PrintWriter
public void writeFooter(List<Purchase> list) throws Exception{ int amountSold = 0; int amountNotSold = 0; int moneyRecieved = 0; openStreams(); printer.println("Проданные товары: "); for(int i = 0; i <= list.size() - 1;i++){ if(list.get(i).isSold()){ writeToFile(list.get(i), dir); amountSold++; moneyRecieved += list.get(i).getPrice(); } } printer.println(); printer.println("Не проданные товары: "); for(int i = 0; i <= list.size() - 1; i ++){ if(!list.get(i).isSold()){ writeToFile(list.get(i), dir); amountNotSold++; } } printer.println(); printer.println("Всего: "+list.size()); printer.println("Кол-во проданно: "+ amountSold); printer.println("Кол-во не проданно: "+ amountNotSold); printer.println("Выручка: "+ moneyRecieved); printer.flush(); System.out.print(printer.checkError()); closeStreams(); } private void openStreams() throws IOException{ writer = new FileWriter(file,true); buffer = new BufferedWriter(writer); printer = new PrintWriter(buffer); } private void closeStreams() throws IOException{ printer.flush(); printer.close(); buffer.close(); writer.close(); } public void writeToFile(Purchase purchase,String dir) throws Exception{ file = new File(dir); if(!file.exists()){ file.createNewFile(); } openStreams(); printer.println(purchase.getName() + " По цене: " + purchase.getPrice() + "руб"); closeStreams(); }
for循环有效,但各行。这真的让我感到困惑!我已经尝试过checkError()并且得到了true,但这仍然无济于事。
checkError(
true
有人可以解释我在做什么错吗?
为什么要在writeToFile调用中打开和关闭流?您不应该在for循环之前在writeFooter()中打开流,在编写代码周围放置一个try块,然后在finally节中关闭它们。
以我的方式来看,您首先在writeFooter中打开了流,然后您编写了printer.println(“Проданныетовары:”);,然后for循环的第一次迭代调用writeToFile,将再次打开未关闭的流,即肯定会覆盖第一行。
打开和关闭用于写入一行的文件效率太低。
你需要类似的东西
writeFooter(...) { try { openStreams(); writeToFile(); } finally { closeStream(); } }
如果writeToFile简单地写入,则不会打开或关闭流,而closeStream安全地关闭流,即检查null等。