Как извлечь конец данных, записанных внутри файла в Java - PullRequest
0 голосов
/ 05 мая 2019

Я создаю пустой файл нужной длины в Android, используя Java следующим образом:

long length = 10 * 1024 * 1024 * 1024;
String file = "PATH\\File.mp4";
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
randomAccessFil.setLength(length);

Этот код создает файл с желаемой длиной и данными NULL. Затем я записываю данные в файл следующим образом:

randomAccessFile.write(DATA);

Теперь мой вопрос: я хочу извлечь конец данных, записанных в файл. Я написал эту функцию, чтобы как можно быстрее найти конец данных с помощью двоичного поиска:

long extractEndOfData(RandomAccessFile accessFile, long from, long end) throws IOException {
    accessFile.seek(from);
    if (accessFile.read() == 0) {
        //this means no data has written into the file
        return 0;
    }
    accessFile.seek(end);
    if (accessFile.read() != 0) {
        return end + 1;
    }
    long mid = (from + end) / 2;
    accessFile.seek(mid);
    if (accessFile.read() == 0) {
        return extractEndOfData(accessFile, from, mid - 1);
    } else {
        if (accessFile.read() == 0) {
            return mid + 1;
        } else {
            return extractEndOfData(accessFile, mid + 1, end);
        }
    }
}

и я вызываю эту функцию следующим образом, чтобы найти конец данных в файле:

 long endOfData = extractEndOfData(randomAccessFile, 0, randomAccessFile.length() - 1);

Эта функция отлично работает для файлов, если их данные начинаются с данных NON-NULL, и среди данных нет таких данных NULL, как этот:

enter image description here

Но для некоторых файлов это не так. потому что некоторые файлы начинаются с NULL данных как:

enter image description here

Что я могу сделать, чтобы решить эту проблему? Большое спасибо.

1 Ответ

1 голос
/ 05 мая 2019

Я думаю, что ваша проблема ясна: вы никогда не сможете узнать, сколько данных записано (или где находится конец содержимого), когда вы ищете только NULL внутри файла. Причина в том, что NULL - это байт со значением 0x00, который появляется во всех видах двоичных файлов (возможно, не в текстовых файлах), а с другой стороны, ваш файл инициализируется с помощью NULL.

Что вы можете сделать, например, сохранить размер ваших данных, записанных в файл, в первых четырех байтах файла. Поэтому при записи данных в файл сначала укажите длину файла, а затем фактическое содержание данных.

Но мне все еще интересно, почему вы не инициализируете размер файла до нужного вам размера.

...