Java 分配大文件

Java 分配大文件,java,Java,我需要分配大小接近50 GB的文件,但以下代码: RandomAccessFile out = new RandomAccessFile("C:\\hello.txt", "rw"); out.setLength(50 * 1024 * 1024 * 1024); // 50 giga-bytes 引发异常: Exception in thread "main" java.io.IOException: Попытка поместить указатель на файл перед нач

我需要分配大小接近50 GB的文件,但以下代码:

RandomAccessFile out = new RandomAccessFile("C:\\hello.txt", "rw");
out.setLength(50 * 1024 * 1024 * 1024); // 50 giga-bytes
引发异常:

Exception in thread "main" java.io.IOException: Попытка поместить указатель на файл перед началом файла
    at java.io.RandomAccessFile.setLength(Native Method)
    at Experiment.main(Experiment.java:8)
:尝试将文件指针移动到文件开头之前

当我尝试分配50兆字节时,这样的异常不会抛出。
磁盘的可用空间远远大于所需的文件大小。

您需要使用
L
后缀将大小定义为
long

out.setLength(50L * 1024L * 1024L * 1024L);
问题是,默认情况下,数字文本是
int
类型,50G超出其范围,因此乘法结果溢出。传递给
setLength()
的实际值为
-2147483648

更详细地说,乘法的结果类型(以及其他数值运算)是由其最通用的操作数定义的,因此实际上不需要为每个操作数添加
L
后缀。仅将其添加到其中一项就足够了(第一项是明智的选择):


50 gb(50*1024^3)大于整数的最大大小(2^32),因此您不能在Java中使用如此大的文件大小是的,您可以通过使用长操作数来拥有如此大的文件。仅供参考,如果您指定
C:/hello.txt
Java将转换为\例如,这里的文件大小有限制吗?在某些情况下,它是2GB,但这里也是真的,还是有一个更大的限制(长)?
long wrong = 50 * 1024 * 1024 * 1024; // -2147483648
long right = 50L * 1024 * 1024 * 1024; // 53687091200