Java FileOutputStream仅在程序终止后写入文件时出错

Java FileOutputStream仅在程序终止后写入文件时出错,java,outputstream,fileoutputstream,Java,Outputstream,Fileoutputstream,我过去曾犯过这个错误,但从未完全理解。关闭OutputStream后,无论java文件的位置或调用方式如何,都会完全破坏所有顺序运行或写入另一个文件的尝试,即使使用了不同的写入文件的方法。出于这个原因,我避免关闭溪流,即使不关闭溪流是一个可怕的习惯。在我的程序中,我创建了一个测试用例,该测试用例有一个close语句,该语句破坏了我以前的所有流,由于某种原因,它们只在程序终止后才写入文件 我将文件位置保持打开状态,它会在适当的时间将文本写入文本文件中,但是Windows中的“预览”面板没有检测到它

我过去曾犯过这个错误,但从未完全理解。关闭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();
}

感谢您的帮助,两种解决方案都解决了我的问题,现在我的代码可以识别文本,但是顺序错误,这是我需要解决的下一个问题。