0

我有一个自定义图像文件,其中第一个数据块是 ASCII 元数据。我需要能够使用 Java 读取文件的这个 ASCII 元数据部分,并知道它何时结束,以及另一种编码中的“原始图像数据”何时开始。

我正在考虑将所有文件读入一个字节 [],然后以某种方式开始从中读取字节并将它们转换为 ASCII,直到我到达 ascii 元数据部分的末尾,此时我将存储这个数据。然后我可以按原样以不同的顺序重新排列原始二进制数据(无需阅读)。但是,我可以考虑这样做的唯一方法是逐字节读取 ascii 内容并查找新行,并在新行之前连接所有内容,看看这是否是表示开始的标签原始图像数据。但是,必须有更好的方法来使用 readLine() 读取文件的 ascii 部分,然后能够立即从原始图像二进制文件开始,而无需在新的阅读器中重新打开文件并转到其他读者我找到了“开始图片”

有任何想法吗?

4

2 回答 2

1
  • 打开文件为FileInputStream(包装在 a 中BufferedInputStream
  • 创建一个ByteArrayOutputStream
  • 逐字节读取输入流,使用字符串搜索算法查找“开始图像”标签。将单个字节转换为char(隐式使用 ASCII)
  • 同时,将您查看过的每个字节写入ByteArrayOutputStream
  • 找到标签后,您可以开始从输入流中读取图像数据
  • 从中获取字节数组ByteArrayOutputStream并将其转换为字符串使用new String(array, "US-ASCII");

通过在输入流上使用 a 可以轻松地进行字符串搜索Scanner,但是您必须小心使用哪种模式以确保它会在不开始读取图像数据的情况下找到标记(因为您想读取你自己从你保持一个单独的引用的基础输入流中)。

编辑:不幸的是,看起来 Scanner 也隐式使用缓冲区,所以剩下的唯一选择是“手动”实现字符串搜索。

于 2009-08-27T09:24:33.197 回答
1

不确定您是否可以自己决定格式,但无论如何:

另一种策略是在文件的第一个位置写入一个整数值,其中包含用于 ascii 分区的字节数。然后您可以只读取该字节数,也可以轻松跳过 ascii 并直接转到二进制 blob。

这种策略是有效的,但是你不能在不改变计数的情况下改变 ascii 文本字符的数量。

顺便说一句,请确保清理您的输入:不要尝试读取更多数据然后文件包含或分配更多内存,然后机器有能力。

就我个人而言,我还会使用文件的前几个字符来包含一些魔术代码,这样您就可以对文件使用您的数据格式以及数据格式的版本进行最低限度的检查。

于 2009-08-27T09:45:17.430 回答