【问题标题】:How should I check if BufferedWriter is already closed?我应该如何检查 BufferedWriter 是否已经关闭?
【发布时间】:2016-07-18 00:21:18
【问题描述】:

在 android 中,我在单击按钮时写入文件,下次单击时,它会保存文件并关闭缓冲的写入器。但是,我还想实现在 onDestroy 函数中关闭缓冲写入器的功能。在此之前我需要知道Bufferedwriter 是否已经关闭。如何检查 Buffered Writer 是否已关闭?

除此之外,bufferedWriter.close() 函数是否将bufferedWriter 设置为null

【问题讨论】:

  • if (writer ! = null) 然后关闭它。
  • "是否 bufferedWriter.close() 函数将 bufferedWriter 设置为 null" 不,这是不可能的。 bufferedWriter 只是对 BufferedWriter 实例的引用;该实例可以有零个或多个对其的引用,并且它无法知道实际引用它的内容。

标签: java file-handling bufferedwriter


【解决方案1】:

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

不过,如果你想知道Writer是否关闭,你可以调用writer.flush(),如果它抛出IOException则说明Writer已经关闭了。

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

【讨论】:

  • 感谢您的解释。
【解决方案2】:

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

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

如果你使用的是 java7 或更高版本,那么你不必担心关闭 BufferredWriter

JDK 7 以后你可以尝试使用资源

例如

try(BufferredWriter bufferedWriter=new BufferredWriter())
{

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

【讨论】:

    【解决方案3】:
        BufferedWriter vf = new BufferedWriter(new FileWriter("file"));
    
        if (vf != null)
        {
            vf.close();
            vf.close(); //won't cause any problem
        }
    

    如果BufferedWriter 不为空,您可以关闭任意多次。所以不需要专门检查BufferedWriter是否打开。

    如果你在 try/catch 中包含 close 语句以防 IOException 发生,那就更好了。

    来自 javadocs

    关闭流,首先刷新它。关闭流后,进一步的 write() 或 flush() 调用将导致抛出 IOException。关闭以前关闭的流没有效果。

    正如 sidgate 所解释的,关闭流不会使您必须手动分配的引用无效。

    【讨论】:

    • 哇,这对我来说是新的。你能提供这种行为背后的任何解释吗?
    • 来自 javadocs Closing a previously closed stream has no effect.。我只是简单地提到了 javadoc。 :)
    【解决方案4】:

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

    参考this

    另外,你可以这样检查

    定义以下2个变量为实例变量

    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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2017-12-01
      • 2015-08-11
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多