FileWriter 不写?

FileWriter not writing?

我有这段代码:

        try {
            f1 = new File("sink.txt");
            f1.createNewFile();
            fw = new FileWriter(f1);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ... code ...
        System.out.println(sequence);
        System.out.println(mySink.indexOf(sequence));
        String result = "";
        int firstIndex = mySink.indexOf(sequence);
        if (firstIndex >= 0) {
            System.out.println(true);
            int secondIndex = mySink.indexOf(sequence, firstIndex + sequence.length());
            if (secondIndex >= 0) {
                System.out.println(true);
                result = mySink.substring(firstIndex, secondIndex + sequence.length());
                System.out.println(result);
            }
        }
        try { // Write it to file
            fw.write(result);
        } catch (IOException e) {
            e.printStackTrace();
        } 
        System.out.println("done");

当我运行时,它打印了字符串 sequence 和它在 mySink 中的索引。然后它进入 if 语句并打印出两个 true 并打印出 result 所以我知道 result 已成功初始化。但是当我查看文件 sink.txt 时,我发现它是空白的。为什么会这样?我在我的代码中遗漏了什么吗?它之前工作正常,我添加了更多代码,它就这样做了。在程序执行期间,我从不触摸 FileWriterFile。提前致谢!

如果你想看,这是我的输出:

[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 98, 48, 43, 47, 89]
2000466
true
true
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 98, 48, 43, 47, 89]
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 59, 48, 43, 47, 89]
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 81, 59, 48, 43, 47, 89]
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 81, 98, 48, 43, 47, 89]
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 98, 48, 43, 47, 89]
done

简短的回答是您没有关闭(或冲洗)您的 FileWriter。这意味着您的应用程序将退出,但未写入的数据仍位于文件缓冲区中。

您的代码中还有许多其他错误。从顶部开始:

    try {
        f1 = new File("sink.txt");
        f1.createNewFile();
        fw = new FileWriter(f1);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
  1. createNewFile 调用是多余的。以下 new FileWriter 将创建文件。

  2. 您正在捕获异常并继续进行,就好像什么也没发生一样。您 >>cannot<< 从这些异常继续。只有成功打开文件,其余代码才能正常工作。

  3. 你不需要捕捉 FileNotFoundException 除非你打算以不同的方式处理它。抓取IOException就够了,因为它是前者的超类

  4. 此时,您应该使用 try-with-resources:

    f1 = new File("sink.txt");
    try (FileWriter fw = new FileWriter(f1)) {
    
       // compute stuff
    
       // write stuff to file
    
    } catch (FileNotFoundException ex) {
        System.out.println(ex.getMessage());
    } catch (IOException ex) {
        // This is ugly for a real app.  However, an IOException that
        // is not a FileNotFoundException is "unexpected" at this point
        // and providing a user-friendly explanation would be tricky. 
        ex.printStackTrace();  
    }
    

    try-with-resources 将导致 fw 在块退出时自动关闭。关闭写入器将首先刷新它。