分配大文件

时间:2014-12-19 16:26:50

标签: java

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

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兆字节这样的异常时不会抛出。 磁盘的可用空间远大于所需的文件大小。

1 个答案:

答案 0 :(得分:9)

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

out.setLength(50L * 1024L * 1024L * 1024L);

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

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

long wrong = 50 * 1024 * 1024 * 1024; // -2147483648
long right = 50L * 1024 * 1024 * 1024; // 53687091200