有没有办法通过“标准”Java(J2SE 5或更高版本)可靠地“分配”(保留)硬盘空间?
以多线程应用程序为例,在线程池中执行,每个线程都下载文件。应用程序如何确保其下载不会因磁盘空间耗尽而中断?
至少,如果它事先知道它正在下载的文件的大小,它是否可以进行某种“预留”,这将保证文件下载,而不管其他线程在做什么?
(有similar question in StackOverflow,但它不讨论多线程,也使用NIO。)
编辑:经过一些进一步测试后,类似问题上提出的解决方案似乎不起作用,因为可以通过建议的RandomAccessFile方法设置任何允许的长度,无论底层硬盘空间如何。例如,在只有几千兆字节可用的分区上,我可以随意创建TB(terrabyte!)文件。
如果File类的getFreeSpace()方法每次创建一个新文件时报告的可用空间量减少,那么解决方案就足够了,但实际上并没有,因此确认零长度,这在实践中是,这些文件似乎有。
这些至少是我在CentOS 5.6虚拟机上看到的结果,在VMWare Player 4.0.0中运行。
答案 0 :(得分:1)
将零写入文件。这将确保您已分配磁盘空间(除非正在使用驱动器压缩或文件的其他可变大小编码)。
你可能会为每个块写一个零,但确定块大小可能并不简单。
这是为了避免创建一个没有分配所有空间的sparse file。