我过去曾遇到此错误,但从未完全理解它。关闭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";
}
}
如有需要,我很乐意回答任何澄清性问题。谢谢您的协助。
答案 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
(其中FileOutputStream
是OutputStream
),这就是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();
}