1. ホーム
  2. java

[解決済み】このjava.io.IOExceptionを回避する方法。デバイスに空き容量がない

2022-02-08 01:42:40

質問

容量が一杯の場合、以下のような例外が発生することがあります。

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でこれを回避する方法はありますか。つまり、スペースがない場合は、書き込みを呼び出さないということです。

どのように解決するのですか?

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 他のプロセスが同じディスクを使用している可能性があるためです。