【问题标题】:How can closing a FileInputStream cause a "No Space Left on Device" error?关闭 FileInputStream 如何导致“设备上没有剩余空间”错误?
【发布时间】:2013-01-30 14:55:16
【问题描述】:

我对我的程序最近开始抛出的错误感到有些困惑。

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

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

【问题讨论】:

  • 添加了澄清代码。
  • 可能是操作系统正在将一些东西写入磁盘,访问日志等。
  • 您尝试获取的文件位于何处?可能是其他设备拒绝访问并给出总容量值为 0,java 将其解释为存储空间不足?在我的机器上运行代码不会产生任何错误。
  • 操作系统和Java版本是多少?
  • 可能打开了一个新的文件描述符,但是达到了限制?

标签: java exception ioexception fileinputstream


【解决方案1】:

在这种情况下,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

InputStreamclose操作不会改变文件本身,但可以改变文件的metadata——比如上次访问时间等。

【讨论】:

  • InputStream 上得到这个仍然令人惊讶。
猜你喜欢
  • 2014-08-31
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多