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

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

4

1 回答 1

2

在这种情况下,从关闭流IOException的方法中抛出。native

将其定义为抛出异常的原因是因为该close操作执行最终操作flush- 因此,如果IOException在刷新期间发生 an ,它将被抛出。

您收到的异常有几个原因:

  • 您可能缺乏对特定文件夹的写入权限。

  • 您可能已超出配额。

我个人也建议你使用以下关闭流的方法:

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方法,因为在您的情况下您没有更改文件并且您可能对该方法的结果不感兴趣。closeQuietlyclose

编辑:

亨利是对的。我阅读InputStream并自动将其更改为OutputStream.

对文件的close操作InputStream不会改变文件本身,但可以改变metadata文件的 - 例如上次访问时间等。

于 2013-02-06T12:44:18.033 回答