【问题标题】:Java: Reading a file containing both text and binary dataJava:读取包含文本和二进制数据的文件
【发布时间】:2013-03-20 18:18:45
【问题描述】:

我被要求在工作中实施的新文件格式遇到问题。

基本上,该文件是一个文本文件,其中包含一堆包含有关 UTC-8 数据信息的标题,然后文件的其余部分是二进制数字数据。我可以很好地写入数据并将其读回,并且我最近添加了代码来编写标题。 问题是我不知道如何读取包含文本和二进制数据的文件。我希望能够读入并处理标头信息(相当广泛),然后能够继续读取二进制数据而无需重新遍历标头。这可能吗?

我目前正在使用FileInputStream 读取二进制数据,但我不知道如何在数据的开头启动它,而不是在整个文件的开头。 FileInputStream 的构造函数之一将FileDescriptor 作为参数,我认为这是我的答案,但我不知道如何从另一个文件读取类中获取一个。我的处理方法正确吗?

【问题讨论】:

标签: java file-io binary-data


【解决方案1】:

您可以通过getChannel() 获取channel 并在该频道上调用position(),将FileInputStream 重新定位到任意点。

需要注意的是,这个位置会影响流的所有消费者。如果您有不同的线程(例如)从同一文件的不同部分读取,则不适合。在这种情况下,为每个消费者创建一个单独的FileInputStream

此外,此技术仅适用于 file 流,因为可以随机访问底层文件。套接字、命名管道或其他任何实际上是的东西都没有等价物。

【讨论】:

  • 在我看来,他似乎不知道位置,他必须先找到位置才能读取二进制数据。
  • @jarnbjo - 根据他第一段的结尾,他似乎确实知道数据从哪里开始。但他完全有可能使用BufferedReader 之类的东西来处理文本,因此基础文件位置无效。也许如果/当他回来时,我们会得到澄清。
  • AFAIK,标准 API 无法将 InputStream 包装在 Reader 中,并交替从 Reader 读取字符和从 InputStream 读取二进制数据。即使是“普通”的 InputStreamReader 也可能从底层流中消耗更多的原始数据,而不是实际转换为字符并由读取方法返回的数据。
  • @jarnbjo - 你是对的,但还有其他选择。例如,您可以编写一个流装饰器,它会一直读取到换行符,然后将字节转换为字符串。
  • 如果您只需要支持像 UTF-8 这样的固定编码并且文本部分包含一个或多个文本行(以换行符结尾),那当然是一种选择。支持其他编码或在文本和二进制数据之间使用更复杂的分隔符实际上比听起来要复杂得多。
猜你喜欢
  • 2011-10-30
  • 2011-07-26
  • 2021-12-27
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多