错误,其中FileOutputStream仅在程序终止后才写入文件

时间:2019-07-15 15:44:57

标签: java outputstream fileoutputstream

我过去曾遇到此错误,但从未完全理解它。关闭OutputStream之后,无论使用java文件的位置如何或以何种方式调用OutputStream,即使使用了不同的写入文件的方法,也完全可以破坏所有顺序运行或尝试写入另一个文件。因此,即使这是一个可怕的习惯,我也避免关闭流。在我的程序中,我创建的是一个测试用例,该用例具有一个close语句,该语句破坏了我之前的所有流,由于某种原因,它们仅在程序终止后才写入文件。

我保持文件位置为打开状态,并在适当的时间将Text写入文本文件,但是Windows中的“ Preview”面板未检测到它(以前曾经发生过)。请注意,在意外关闭流之前,所有操作均正常进行。有没有办法重置流?我曾尝试在此过程中刷新它,但仍然没有像以前那样运行。

以下是用于创建文件的方法:

protected void createFile(String fileName, String content) {
    try {
        String fileLoc = PATH + fileName + ".txt";
        File f = new File(fileLoc);
        if(!f.isFile())
            f.createNewFile();
        FileOutputStream outputStream = new FileOutputStream(fileLoc);
            byte[] strToBytes = content.getBytes();
            outputStream.write(strToBytes);
    } catch (IOException e) {
        e.printStackTrace();
        return;
    }
}

以及用于读取文件的方法:

protected String readFile(String fileName) {
    try {
        StringBuilder sb = new StringBuilder("");
        String fileLoc = PATH + fileName + ".txt";
        File f = new File(fileLoc);
        if(!f.exists())
            return "null";
        Scanner s = new Scanner(f);
        int c = 0;
        while(s.hasNext()) {
            String str = s.nextLine();
            sb.append(str);
            if(s.hasNext())
                sb.append("\n");
        }
        return sb.toString();
    } catch(Exception e) {
        e.printStackTrace();
        return "null";
    }
}

如有需要,我很乐意回答任何澄清性问题。谢谢您的协助。

2 个答案:

答案 0 :(得分:1)

没有try-resource,您需要在final子句中关闭以确保没有泄漏。或者,如果您需要更多的“及时”更新,请使用Stream.flush()

} catch (IOException e) {
   e.printStackTrace();
   return;
} finally {
   outputStream.close();
}

答案 1 :(得分:0)

您需要在流上调用flush(),以将字节写入流中。

您当前正在自己​​呼叫write(),如下所示:

FileOutputStream outputStream = new FileOutputStream(fileLoc);
outputStream.write(content.getBytes());

您要执行的操作是:

FileOutputStream outputStream = new FileOutputStream(fileLoc);
outputStream.write(content.getBytes());
outputStream.flush();

从Javadoc(https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html#flush--)中获取OutputStream(其中FileOutputStreamOutputStream),这就是flush()的含义:

  

刷新此输出流,并强制写出所有缓冲的输出字节。刷新的一般约定是,调用它的指示是,如果先前写入的任何字节已由输出流的实现缓冲,则应立即将这些字节写入其预期的目的地。

更好的方法是在finally块中关闭流,这样无论您的代码总是尝试释放任何打开的资源,如下所示:

FileOutputStream outputStream = null;
try {
    outputStream = new FileOutputStream(fileLoc);
    outputStream.write(content.getBytes());
    outputStream.flush();
} finally {
    if (outputStream != null) {
        outputStream.close();
    }
}

或使用自动资源管理,如下所示:

try (FileOutputStream outputStream = new FileOutputStream(fileLoc)) {
    outputStream.write(content.getBytes());
    outputStream.flush();
}