我需要分配大小接近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兆字节这样的异常不会抛出.磁盘的可用空间远大于所需的文件大小.
您需要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)
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |