gpt4 book ai didi

java - 如何使用Java nio在写操作期间检测磁盘已满?

转载 作者:行者123 更新时间:2023-12-01 10:14:24 24 4
gpt4 key购买 nike

我想写入一个来自网络的文件,所以我不知道传入的文件的大小。有时文件服务器上的磁盘可能会被填满,我想返回一条消息向我的客户通知他们此错误。我找不到任何关于能够捕获此类 I/O 错误的文档。 FileChannel 将字节从内存传输到磁盘,因此检测到这一点可能并不简单。保存是异步发生的吗?是否可以检测磁盘已满?

// Create a new file to write to
RandomAccessFile mFile = new RandomAccessFile(this.mFilePath, "rw");
FileChannel mFileChannel = this.mFile.getChannel();

// wrappedBuffer has my file in it
ByteBuffer wrappedBuffer = ByteBuffer.wrap(fileBuffer);
while(wrappedBuffer.hasRemaining()) {
bytesWritten += this.mFileChannel.write(wrappedBuffer, this.mBytesProcessed);
}

我想在File类中,我们可以做这样的事情:

// if there is less than 1 mb left on disk
new File(this.mFilePath, "r").getUsableSpace() < 1024;

但是如果 this.mFileChannel.write() 因为磁盘已满而失败,是否有办法抛出异常?

最佳答案

即使不建议解析错误消息,您也可以执行以下操作:

import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystemException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.regex.Pattern;

public class SmallDisk {

final static String SMALL_DISK_PATH = "/Volumes/smallDisk";

final static Pattern NO_SPACE_LEFT = Pattern.compile(": No space left on device$");

public static void main(String[] args) throws NoSpaceException {
Path p = Paths.get(SMALL_DISK_PATH);
FileStore fs = null;
try {
fs = Files.getFileStore(p);
System.out.println(fs.getUsableSpace());
Path newFile = Paths.get(SMALL_DISK_PATH + "/newFile");
Files.createFile(newFile);

} catch (FileSystemException e) {
//We catch the "No space left on device" from the FileSystemException and propagate it
if(NO_SPACE_LEFT.matcher(e.getMessage()).find()){
throw new NoSpaceException("Not enough space");
}
//Propagate exception or deal with it here
} catch (IOException e) {
//Propagate exception or deal with it here
}

}

public static class NoSpaceException extends IOException{

public NoSpaceException(String message) {
super(message);
}
}
}

另一种方法但不能保证您不会出现异常,那就是在写入之前使用 FileStore 检查您是否有足够的空间(如果您正在使用共享文件夹或多线程软件,则空间不够)

关于java - 如何使用Java nio在写操作期间检测磁盘已满?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com