【问题标题】:while loop and printwriter only writes one line to filewhile 循环和 printwriter 仅将一行写入文件
【发布时间】:2016-11-23 19:57:32
【问题描述】:

我编写了一个代码,该代码从文件夹中的不同文件中获取一堆数据,然后我确保只在文件中查找特定类型的单词。然后我确保代码在控制台中打印出结果。

到目前为止,我所做的所有事情都完美无缺,但问题来了。我希望代码还将信息打印/写入 .txt 文件。这种工作,但它只打印来自不同文件的多行之一。我完全确定还有不止一个,因为控制台打印显示至少 20 行包含正确的单词。 我不完全确定我哪里出错了,我也尝试在.close(); 之前添加.flush();,但它仍然无法正常工作。我还尝试在sc.close(); 下添加pToDocu.close();,但这也不起作用,因为它甚至不写任何东西,只会创建一个空白文件。

所以简而言之,代码应该写一堆行,但它只写一个。

 public static void lisFilesF(final File folderV) throws IOException {
            PrintWriter pTD = new PrintWriter("eFile.txt");
            for (final File fileEntry : folderV.listFiles()) {
                if (fileEntry.isDirectory()) {
                    listFilesForFolder(fileEntry);    
                } else {
                    System.out.println(fileEntry.getName());
                    try {
                        Scanner sc = new Scanner(fileEntry);
                        while (sc.hasNextLine()) {
                            String s = sc.nextLine();
                            if(s.contains("@"))
                            {
                            System.out.println(s);
                            pTD.println(s);
                            pTD.close();
                            }
                        }
                        sc.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                }
                }
            }
        }

更新

我已将代码更改为现在将 pTD.close(); 置于 while 循环之外,如下所示。唯一的问题是现在创建的文件是空白的,里面没有任何信息。

public static void lisFilesF(final File folderV) throws IOException {
                PrintWriter pTD = new PrintWriter("eFile.txt");
                for (final File fileEntry : folderV.listFiles()) {
                    if (fileEntry.isDirectory()) {
                        listFilesForFolder(fileEntry);    
                    } else {
                        System.out.println(fileEntry.getName());
                        try {
                            Scanner sc = new Scanner(fileEntry);
                            while (sc.hasNextLine()) {
                                String s = sc.nextLine();
                                if(s.contains("@"))
                                {
                                System.out.println(s);
                                pTD.println(s);
                                }
                            }
                            sc.close();
                            pTD.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                    }
                    }
                }
            }

【问题讨论】:

  • 第一次写入后您将关闭 PrintWriter (pTD)。在所有写入完成之前,您不应该关闭 PrintWriter
  • 我认为您仍然过早关闭您的 pTD。您在 for 循环之前打开它。看起来你需要在你的 for 循环之后关闭它。
  • @blackpanda 你是一个血腥的传奇!它现在正在工作,非常感谢。 PS您可以将其作为答案,以便我可以将其作为正确的答案。

标签: java file java.util.scanner printwriter println


【解决方案1】:

第一次写入文件后,您将关闭文件 (pTD)。您应该从循环中提取 close() 调用并将其移到后面:

Scanner sc = new Scanner(fileEntry);
while (sc.hasNextLine()) {
    String s = sc.nextLine();
    if(s.contains("@")) {
        System.out.println(s);
        pTD.println(s);
    }
}
sc.close();
pTD.close();

【讨论】:

  • 感谢您的反馈,我现在已经更改了它,但现在它只是创建了一个空白文件。虽然在运行 Java 函数时,文件似乎已经获得了所有信息,但随后消失了。我不完全确定它为什么会这样。
【解决方案2】:

删除

pTD.close();

来自您的 while 循环。你在第一次写后关闭你的Print Writer

【讨论】:

  • 感谢您的反馈,我已经进行了更改,但现在创建的文件只是空白。
【解决方案3】:

您似乎想将所有这些记录提交到您的PrintWriter。因此,您的 pTD.close(); 需要在您的 for 循环之外,因为您在 for 循环之前声明了 PrintWriter。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多