Java FileOutputStream仅在程序终止后写入文件时出错
我过去曾犯过这个错误,但从未完全理解。关闭OutputStream后,无论java文件的位置或调用方式如何,都会完全破坏所有顺序运行或写入另一个文件的尝试,即使使用了不同的写入文件的方法。出于这个原因,我避免关闭溪流,即使不关闭溪流是一个可怕的习惯。在我的程序中,我创建了一个测试用例,该测试用例有一个close语句,该语句破坏了我以前的所有流,由于某种原因,它们只在程序终止后才写入文件 我将文件位置保持打开状态,它会在适当的时间将文本写入文本文件中,但是Windows中的“预览”面板没有检测到它(过去经常发生这种情况)。请注意,在流意外关闭之前,这一切都工作得很好。是否有重置流的方法?我已经尝试在这个过程中冲洗它,但它仍然没有像以前那样运行 以下是用于创建文件的方法:Java FileOutputStream仅在程序终止后写入文件时出错,java,outputstream,fileoutputstream,Java,Outputstream,Fileoutputstream,我过去曾犯过这个错误,但从未完全理解。关闭OutputStream后,无论java文件的位置或调用方式如何,都会完全破坏所有顺序运行或写入另一个文件的尝试,即使使用了不同的写入文件的方法。出于这个原因,我避免关闭溪流,即使不关闭溪流是一个可怕的习惯。在我的程序中,我创建了一个测试用例,该测试用例有一个close语句,该语句破坏了我以前的所有流,由于某种原因,它们只在程序终止后才写入文件 我将文件位置保持打开状态,它会在适当的时间将文本写入文本文件中,但是Windows中的“预览”面板没有检测到它
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";
}
}
以及用于读取文件的方法:
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";
}
}
如果需要,我很乐意回答任何澄清问题。谢谢您的帮助。如果没有try资源,您需要在最后一句中关闭以确保没有泄漏。如果需要更多“及时”更新,请使用
Stream.flush()
}捕获(IOE异常){
e、 printStackTrace();
回来
}最后{
outputStream.close();
}
您需要在流上调用flush()
,将字节写入流
您当前正在自己调用write()
,如下所示:
FileOutputStream outputStream = new FileOutputStream(fileLoc);
outputStream.write(content.getBytes());
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();
}
您要做的是:
FileOutputStream outputStream = new FileOutputStream(fileLoc);
outputStream.write(content.getBytes());
outputStream.flush();
从Javadoc()的OutputStream
(其中FileOutputStream
是一个OutputStream
),这就是它对flush()
的说明:
刷新此输出流并强制写入任何缓冲输出字节。flush的一般约定是,调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预期目的地
更好的做法是在finally
块中关闭流,这样无论您的代码如何,都会尝试释放任何开放资源,如下所示:
FileOutputStream outputStream = new FileOutputStream(fileLoc);
outputStream.write(content.getBytes());
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();
}
或者使用自动资源管理,如下所示:
FileOutputStream outputStream = new FileOutputStream(fileLoc);
outputStream.write(content.getBytes());
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();
}
感谢您的帮助,两种解决方案都解决了我的问题,现在我的代码可以识别文本,但是顺序错误,这是我需要解决的下一个问题。