java - FileOutputStream 空间不足时关闭

标签 java ioexception fileoutputstream diskspace bufferedwriter

我在 Java 中使用 FileOutputStreamBufferedWriter 时遇到了问题。

如果我的磁盘空间已满并且我正在尝试写入,它将抛出IOException(这是正确的),但是当调用writer.close()时,它将无法关闭资源,抛出另一个 IOException 并保持资源打开!

这是我使用 writer.flush() 的解决方法。看起来可行,但是有更好的方法来处理这个问题吗?

BufferedWriter writer = null;

    try {
         writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), encoding));
         StringBuilder buff = new StringBuilder();
         writeToStream(buff, separator, data);
         writer.write(buff.toString());
         writer.flush(); // flush before closing to make sure there is enough space on disk to complete the close()
         logger.trace("writeFile: file written, file={}", file);
    } catch (IOException e) {
         logger.error("writeFile: cannot write to file: {}", file, e);
         throw new ... //some exception wrapper here
    } finally {
         if (writer != null) {
               try {
                     writer.close();
               } catch (IOException e) {
                     // ignore
               }
          }
     }

最佳答案

您应该尝试按照打开资源的相反顺序关闭所有资源。在这里,您尝试仅关闭一个。

如果您有 Java 7,请使用 try-with-resources 语句。如果不这样做,最好的方法是使用 Guava's Closer (自版本 14.0 起可用):

final Closer closer = Closer.create();
final FileOutputStream out;
final OutputStreamWriter writer;
final BufferedWriter buffered;

try {
    out = closer.register(new FileOutputStream(file), encoding));
    writer = closer.register(new OutputStreamWriter(out));
    buffered = closer.register(new BufferedWriter(writer));
    // do stuff
} catch (IOException e) {
    throw closer.rethrow(e);
} finally {
    closer.close();
}

如果您没有Closer,则很容易重新创建。

关于java - FileOutputStream 空间不足时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17365948/

相关文章:

java - ProtocolException:流的意外结束

java - 将对象写入输出文本文件

java - 为什么有些类限制直接实例化?

Java:如何在没有异常的情况下停止服务器(关闭套接字)?

java - 有没有办法在 Java 中区分不同的泛型实例化运行时?

c# - 奇怪的控制台 MoveBufferArea IOException

java - 如何比较两个文本文件的内容并输出到另一个文本文件中?文本1 - 文本2

android - 为什么这个 Android FileOutputStream 会抛出 NullPointerException?

java - int 数组或字符串数​​组或我错了

java - 测试类不认为我的 ArrayList 是 ArrayList