Пропуск частей файла - PullRequest
0 голосов
/ 17 июня 2019

Я написал код, который дает мне значения того, где разделить файл по размеру. Проблема заключается в том, что при изменении длины файла я получаю неправильные значения, где следует разбивать файл.

Это код: (Я не уверен, что это самый быстрый способ определить, где я должен разбить файл.)

long parts = 5L;
long len = 123456L;
long partLen = len / parts;
long tmp = 1L;
for (int i = 0; i < parts; i++) {
    tmp += partLen;
    long start = tmp - partLen;
    long end = tmp - 1L;
    System.out.printf("%d to %d\n", start, end);
}

Будет выведено:

1 to 24691
24692 to 49382
49383 to 74073
74074 to 98764
98765 to 123455  

Эти значения являются байтами. Я буду использовать эти значения для чтения части файла и его записи.
Ex. Прочитайте 1 байт до 24691 байта, затем запишите его в файл ...

Видите, что 123455 не совсем 123456. Как я могу добавить оставшиеся байты?
Что я должен использовать, чтобы прочитать файл, RandomAccessFile 'seek() + read(byte[] b)? или BufferedInputStream х read(buffer,offset,len)?

1 Ответ

0 голосов
/ 17 июня 2019

Разница между последним байтом и длиной - это остаток.Вы делаете целочисленную математику, и Лен не делится полностью на части.Результат для всех следующих возвращает одно и то же значение partLen

System.out.println(123455 / 5);
System.out.println(123456 / 5);
System.out.println(123457 / 5);
System.out.println(123458 / 5);
System.out.println(123459 / 5);

Создает следующий вывод

24691
24691
24691
24691
24691

Это необходимо учитывать при расчете размера раздела.Если есть остаток, размер раздела должен быть на 1 больше.Если остатка нет, тогда ваш текущий расчет верен.

Вы можете использовать либо RandomAccessFile, либо BufferedInputStream в зависимости от того, как вы хотите обработать разделы.Моим личным предпочтением было бы просто открыть BufferedInputStream один раз и переключать выходные файлы после прочтения длины раздела.Но нет ничего плохого в том, чтобы заняться каждым разделом отдельно, используя RandomAccessFile.

В дополнение к этому:

  1. Обычно вы ссылаетесь на байты с индексом на основе 0 (и действительно, если вы используете RandomAccessFile.seek(), он будет ожидать позицию поисканачиная с 0, а не 1) поэтому инициализируйте переменную tmp с 0.

  2. Я уверен, что вы знаете, но последний раздел должен быть min of end и len (len - 1, если вы меняете индекс на 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...