Мне нужно прочитать двоичный файл в java и разделить его (на самом деле это двоичный файл, содержащий много файлов pdf, с одной строкой «метаданные» перед каждым).
Каждый элемент PDF из двоичного файла заканчивается маркером "%%EOF"
.
Моя первая попытка, я построчно считывал файл как файл UTF-8, но это повредило двоичные данные !!
reader = new BufferedReader(new InputStreamReader(new FileInputStream(binaryFile), "UTF-8"));
String mdmeta;
while ((mdmeta = reader.readLine()) != null) {
System.out.println("read file metadata: " + mdmeta);
writeToFile("exploded-file-123");
}
и метод writeToFile
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fullFilename), "UTF-8"));
writer.write("%PDF-1.4\r\n");
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.write("\r\n");
if ("%%EOF".equals(line)) {
writer.flush();
return;
}
}
... хотя это разбивает файл на разобранные элементы, эти двоичные файлы повреждены (конечно, потому что я читал и записывал байты как UTF-8
строки ...)
Я думаю, что мне нужен более низкоуровневый подход с использованием InputStream's.
Это становится сложным, поскольку файлы могут быть большими. Представьте, что я использую буфер ... Я могу прочитать байты из файла, чтобы заполнить буфер ... тогда мне нужно найти "%%EOF"
внутри буфера ... и вручную разделить буфер между предыдущим разобранным элементом и следующий.
Или, если "%%EOF"
упадет на край буфера, тогда я могу полностью пропустить границу файла ...
Полагаю, я ищу какой-то путь к readBytesUpUntil("%%EOF")
- есть ли простой способ сделать это?