如何检查BufferedWriter是否已经关闭?

4
在Android中,我在点击按钮时编写文件,并在下次点击时保存文件并关闭缓冲区编写器。但是,我还想在onDestroy函数中实现关闭缓冲区编写器的功能。在那之前,我需要知道BufferedWriter是否已经关闭。如何检查Buffered Writer是否已经关闭?
此外,bufferedWriter.close()函数是否会将bufferedWriter设置为null

1
如果(writer != null),那么关闭它。 - SatyaTNV
“bufferedWriter.close()函数会将bufferedWriter设置为null吗?” 不,这是不可能的。bufferedWriter只是对BufferedWriter实例的引用;该实例可以有零个或多个引用,并且它无法知道实际上是什么在引用它。 - Andy Turner
4个回答

5

在已经关闭的写入器上调用close方法没有影响。

尽管如此,如果您想知道写入器是否关闭,可以调用writer.flush(),如果它抛出IOException,那么就意味着该写入器已经关闭。

对于您的第二个问题,关闭流并不会将引用设置为null。您必须显式地将其设置为null


感谢您的解释。 - Astra Uvarova - Saturn's star

0

你可以检查 bufferredWriter 是否不等于 null

if(bufferredWriter!=null)
{
bufferredWriter.close();
}

如果您正在使用Java7或更高版本,则无需担心关闭BufferredWriter

JDK 7及以上版本可以使用try with resource

例如

try(BufferredWriter bufferedWriter=new BufferredWriter())
{

//your code
}
catch(Exception e)
{
}

0
    BufferedWriter vf = new BufferedWriter(new FileWriter("file"));

    if (vf != null)
    {
        vf.close();
        vf.close(); //won't cause any problem
    }

如果BufferedWriter不为null,则可以随意关闭它。因此,没有必要特别检查BufferedWriter是否打开。

如果在发生IOException的情况下将关闭语句放在try/catch块中,那就更好了。

从javadocs中可以看到:

关闭流并首先刷新。一旦流被关闭,进一步的write()或flush()调用都会导致抛出IOException。关闭已经关闭的流不会产生任何效果。

正如sidgate所解释的那样,关闭流并不会使你手动分配的引用为空。


哇,这对我来说是新的。你能提供一些关于这种行为背后的解释吗? - Astra Uvarova - Saturn's star
关闭已经关闭的流不会产生任何效果。我只是简单地参考了Javadoc文档。:) - codingenious

0

bufferedWriter.close() - 关闭此写入器。缓冲区的内容被刷新,目标写入器被关闭,并释放缓冲区。只有第一次调用 close 会产生任何效果。

请参阅this

此外,您可以像这样检查

将以下两个变量定义为实例变量

BufferedWriter bufferWriter;
boolean isOpen = false;

那么,

try {
    if (!isOpen) {
        bufferWriter = new BufferedWriter(new FileWriter(file, true));
        bufferWriter.write(initialData);
        isOpen = true;
    }
    bufferWriter.write(remainingData);
    bufferWriter.flush();
    Log.d(TAG, "written to file:" + file.getAbsolutePath());
} catch (IOException e) {
    Log.v("IOException", e.toString());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接