如何避免出现java.io.IOException: No space left on device错误

12

如果我的空间已满,有时会出现以下异常

java.io.IOException: No space left on device
        at java.io.FileOutputStream.writeBytes(Native Method)
        at java.io.FileOutputStream.write(FileOutputStream.java:282)
        at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847)
        at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1756)
        at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:230)

在Java中有没有避免这种情况的方法,我的意思是如果没有空间就不要调用write。


一个 try..catch 块应该能解决问题... - JNYRanger
1
java.io.IOException是通用的吧,可以因为任何其他原因而抛出对吧!!! - Avinash
1
您可以检查消息。无论如何,您都应确保始终有足够的空间。 - Peter Lawrey
首先要可靠地避免出现那种错误是不切实际的。如果你知道需要多少磁盘空间,可以首先检查该空间是否可用,但如果另一个程序也在写入文件,则仍可能会出现错误。大多数程序在遇到错误时会以某种方式来处理它。 - Kenster
2个回答

11

Java 7 NIO提供了FileStore类来检查可用空间大小。

Path p = Paths.get("/your/file"); // where you want to write
FileSystem fileSystem = FileSystems.getDefault();
Iterable<FileStore> iterable = fileSystem.getFileStores();

Iterator<FileStore> it = iterable.iterator(); // iterate the FileStore instances
while(it.hasNext()) {
    FileStore fileStore = it.next();
    long sizeAvail = fileStore.getUsableSpace(); // or maybe getUnallocatedSpace()
    if (Files.getFileStore(p).equals(fileStore) { // your Path belongs to this FileStore
        if (sizeAvail > theSizeOfBytesYouWantToWrite) {
            // do your thing
        }
    }
}

显然,由于没有任何原子性可言,其他进程可能正在使用相同的磁盘,因此仍然可能会发生IOException,请记住这一点并相应地处理异常。


7
在类Unix操作系统中,如果您尝试创建新文件但文件系统的inode已满,则可能会出现“设备上没有剩余空间”的消息。因此,您可能还需要检查可用的inode数量。 - Kenster

1

我来看一下File类文档

这些新方法还包括:

public long getTotalSpace()
public long getFreeSpace()
public long getUsableSpace()

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