Выделить большой файл

мне нужно выделить файл размером около 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 ответов


вам нужно определить размер как long С помощью L суффикс:

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

проблема в том, что по умолчанию, числовые литералы являются int тип и 50G вне своего ряда, поэтому результат переполнения умножения. Фактическое значение, переданное в setLength() is -2147483648.

более подробно, тип результата умножения (а также другие числовые операции) определяется наиболее общим из его операндов, поэтому вам фактически не нужно добавлять the L суффикс к каждому из них. Достаточно добавить его только к одному из них (первый-разумный выбор):

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