关闭FileInputStream怎么会导致"No Space Left on Device"错误?

10

最近我的程序出现了一个错误,让我有些困惑。

java.io.IOException: No space left on device
    at java.io.FileInputStream.close0(Native Method)
    at java.io.FileInputStream.close(FileInputStream.java:259)
    at java.io.FilterInputStream.close(FilterInputStream.java:155)

我假设由于这是一个FileInputStream,所以该文件被保存在内存中而不是物理磁盘上。内存使用率看起来很好,磁盘空间也很充足。这尤其令人困惑,因为它发生在关闭FileInputStream时。如果您能解释一下这种情况如何发生,谢谢。

编辑:代码供审查

if (this.file.exists()) {
            DataInputStream is = new DataInputStream(new FileInputStream(this.file));
            this.startDate = new DateTime(is.readLong(), this.timeZone);
            this.endDate = new DateTime(is.readLong(), this.timeZone);
            is.close();
        } 

正如您在上面所看到的,我只是打开文件,读取一些内容,然后关闭文件。


为了澄清,添加了代码。 - Judicator
可能操作系统正在将一些内容写入磁盘,例如访问日志等。 - SpaceTrucker
你试图获取的文件位于哪里?可能是其他设备拒绝访问并给出了一个总容量值为0,Java将其解释为存储空间不足吗?在我的机器上运行代码没有错误。 - Bartvbl
操作系统和Java版本是什么? - Andremoniy
可能会打开一个新的文件描述符,但达到了限制? - C-Otto
1个回答

2
在这种情况下,IOException是从关闭流的native方法中抛出的。
定义抛出异常的原因是因为close操作执行了最终的flush - 因此,如果在刷新期间发生IOException,它将被抛出。
导致您收到异常的原因有几个:
  • 您可能缺少对特定文件夹的写入权限。

  • 您可能已超过配额。

我还建议您使用以下方法关闭流:
if (this.file.exists()) {
    try {
        DataInputStream is = new DataInputStream(new FileInputStream(this.file));
        this.startDate = new DateTime(is.readLong(), this.timeZone);
        this.endDate = new DateTime(is.readLong(), this.timeZone);
    } catch (Exception ex) {
        // Handle the exception here
    } finally {
        is.close();
    }
}

您也可以使用IOUtils方法closeQuietly,它不会抛出异常,因为在您的情况下,您并没有更改文件,可能对close方法的结果不感兴趣。 编辑: 亨利是正确的。我读到了InputStream,在我的脑海中自动将其更改为OutputStream
InputStream进行close操作不会更改文件本身,但可能会更改文件的元数据,例如最后访问时间等。

InputStream上得到这个仍然令人惊讶。 - Henry

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