当前位置: 首页 > 面试题库 >

PrintWriter未写入文件(Java)

公羊信厚
2023-03-14
问题内容

我正在编写一种自动提款机程序,该程序会将数据输出到文件中(是​​的,我知道它不是英语,但这不是重点),并且遇到了错误。

当我尝试使用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对象最终会占用更多的内存。