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