分配大文件

biv*_*biv 6 java

我需要分配大小接近50千兆字节的文件,但是这段代码:

RandomAccessFile out = new RandomAccessFile("C:\\hello.txt", "rw");
out.setLength(50 * 1024 * 1024 * 1024); // 50 giga-bytes
Run Code Online (Sandbox Code Playgroud)

抛出异常:

Exception in thread "main" java.io.IOException: ??????? ????????? ????????? ?? ???? ????? ??????? ?????
    at java.io.RandomAccessFile.setLength(Native Method)
    at Experiment.main(Experiment.java:8)
Run Code Online (Sandbox Code Playgroud)

:尝试在文件开头之前移动文件指针.

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

Nat*_*tix 9

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

out.setLength(50L * 1024L * 1024L * 1024L);
Run Code Online (Sandbox Code Playgroud)

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

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

long wrong = 50 * 1024 * 1024 * 1024; // -2147483648
long right = 50L * 1024 * 1024 * 1024; // 53687091200
Run Code Online (Sandbox Code Playgroud)