【发布时间】:2019-02-09 14:21:51
【问题描述】:
我需要在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 的。
由于文件可能很大,因此变得复杂。想象一下我使用了一个缓冲区...我可以从文件中读取字节来填充缓冲区...然后我需要在缓冲区内查找"%%EOF"...并在上一个爆炸项和下一个。
或者如果"%%EOF" 落在缓冲区边缘,那么我可能会完全错过文件边界......
我想我正在寻找某种方式来readBytesUpUntil("%%EOF") - 有没有简单的方法可以做到这一点?
【问题讨论】:
-
你知道这个二进制文件的编码吗?
-
不完全确定我是否理解正确,但如果您知道原始编码,为什么不将
%%EOF转换为该编码并仅搜索该编码,始终保持原始编码 -
PDF 文件是二进制文件。您将它们视为文本。这很可能会损坏 PDF,无法修复。而是根据您从
InputStream检索到的字节序列复制内容并将它们存储在OutputStream实例中。 -
@Eugene 我原本以为不是这样,但 PDF 文件显然有“无”编码。它们具有真正可以编码为任何内容的字节流
-
@mkl 你的意思是在内存中建立一个字节序列,直到找到%%EOF,然后再写入文件?
标签: java file pdf stream inputstream