我正在编写一种自动提款机程序,该程序会将数据输出到文件中(是的,我知道它不是英语,但这不是重点),并且遇到了错误。
当我尝试使用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
,但这仍然无济于事。
有人可以解释我在做什么错吗?
为什么要在writeToFile调用中打开和关闭流?您不应该在for循环之前在writeFooter()中打开流,在编写代码周围放置一个try块,然后在finally节中关闭它们。
以我的方式来看,您首先在writeFooter中打开了流,然后您编写了printer.println(“Проданныетовары:”);,然后for循环的第一次迭代调用writeToFile,将再次打开未关闭的流,即肯定会覆盖第一行。
打开和关闭用于写入一行的文件效率太低。
你需要类似的东西
writeFooter(...) {
try {
openStreams();
writeToFile();
} finally {
closeStream();
}
}
如果writeToFile简单地写入,则不会打开或关闭流,而closeStream安全地关闭流,即检查null等。
问题内容: 由于某种原因,我的String部分由PrintWriter编写。结果,我的文件中出现了部分文本。方法如下: 在将文本打印到控制台的地方,我可以看到数据全部存在,没有任何丢失,但是当PrintWriter完成工作时,显然文本的一部分丢失了……我一无所知。 问题答案: 在丢弃打开的流之前,应始终保留流。这将释放一些相当昂贵的系统资源,当您在文件系统上打开文件时,您的JVM必须获取这些资源。
问题内容: 我有下面的代码 执行后,文件创建成功,但创建的文件为空 那么代码有什么问题呢? 问题答案: 您必须关闭,否则不会刷新当前缓冲区。您可以直接调用该方法。 如果要关闭文件,则无需使用该方法。该可用于例如,如果一会你的程序运行和输出文件中的东西,你想在其他地方检查。
我试图使用log4j 2实现一些日志记录。控制台输出是可以的,但当我试图写一些日志到文件我不能管理它。 我的: 我的: 我使用log4j的方式如下: 我使用记录器的类在包下。 xml配置位于src/main/resources下。 日志文件夹与源文件夹处于同一级别。
已创建输出文件,但未写入数字。 程序应读取一个文件,然后创建一个输出文件,该文件反向打印输入文件中的数字。 实际结果只显示文件,但文件中没有写入任何内容。
问题内容: 我们正在从网络服务流式传输CSV文件。看来我们在流式传输时会丢失换行符-客户端将文件全部放在一行上。知道我们在做什么错吗? 码: 问题答案: 不要使用。您已经手头上了,因此只需获取文件的一个,然后通过通常的Java IO方式 将输入中的字节通过管道传输到输出即可。这样,您也不必担心换行符被以下内容吃掉: 如果您不事先知道/指定编码,则使用/ 将涉及字符编码问题。您实际上也不需要在这里了
问题内容: 在阅读有关Java I / O的知识时,我意识到可以通过两种方式写入标准输出。 以下是同时使用这两种技术的代码段 相对于其他使用,是否有任何性能优势? 问题答案: 一个快速的Google透露了Coderanch上的一个线程很有用。 还有其他几种进行控制台编写的方法,但是除了编写更少的代码外,使用一种或另一种似乎没有真正的好处,而且创建新的PrintWriter对象最终会占用更多的内存。