java – 为文件存储预分配驱动器空间

是否有Java方法为应用程序中的独占使用预先分配驱动器空间?

不要求此空间是单独的文件系统或现有文件系统的一部分(因此很容易成为数据库),但它应该允许保留指定的空间量并允许随机读取/写入具有足够高的吞吐量.

最佳答案
您可以尝试使用RandomAccessFile对象并使用setLength()方法.

例:

File file = ... //Create a temporary file on the filesystem your trying to reserve.
long bytes = ... //number of bytes you want to reserve.

RandomAccessFile rf = null;
try{
    rf = new RandomAccessFile(file,"rw"); //rw stands for open in read/write mode.
    rf.setLength(bytes); //This will cause java to "reserve" memory for your application by inflating/truncating the file to the specific size.

    //Do whatever you want with the space here...
}catch(IOException ex){
    //Handle this...
}finally{
    if(rf != null){
        try{
            rf.close(); //Lets be nice and tidy here.
        }catch(IOException ioex){
            //Handle this if you want...
        }
    }
}

注意:在创建RandomAccessFile对象之前,该文件必须存在.

然后可以使用RandomAccessFile对象读取/写入文件.确保目标文件系统有足够的可用空间.空间可能不是“独占”,但您可以随时使用文件锁来执行此操作.

P.S:如果您最终意识到硬盘驱动器速度慢且无用(或者从一开始就意味着使用RAM),您可以使用java.nio中的ByteBuffer对象. allocate()和allocateDirect()方法应该足够了.字节缓冲区将被分配到RAM(和可能的SwapFile)中,并且将独占于此java程序.可以通过改变缓冲区的位置来进行随机访问.由于这些缓冲区使用有符号整数来引用位置,因此最大大小限制为2 ^ 31 – 1.

阅读RandomAccessFile here的更多信息.

阅读FileLock(java对象)here的更多内容.

阅读更多关于ByteBuffer here的信息.

相关文章

Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Sh...
运行程序出现下面错误:HTTP Status 500 ------------------...
1、建立DM的profile,使用的模版在install_root/profileTempl...
使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是...
英文操作系统导致 Debug 下的变量查看时显示乱码,可通过改变...
eclipse中javascript报错问题处理:三个地方:<1&...