【问题标题】:Java ByteBuffer for Zipfile用于 Zipfile 的 Java ByteBuffer
【发布时间】:2014-12-23 13:26:12
【问题描述】:

我有一个包含大端数据的二进制文件。我正在使用此代码在

中阅读它
FileChannel fileInputChannel = new FileInputStream(fileInput).getChannel();
ByteBuffer bb  = ByteBuffer.allocateDirect((int)fileInputChannel.size());
while (bb.remaining() > 0)
    fileInputChannel.read(bb);
fileInputChannel.close();
bb.flip();

我必须为 zip 文件做一些相同的事情。换句话说,从 zip 文件中解压缩文件并对其进行排序。我知道我可以通过 ZipInputStream 读取它,但是我必须提供“字节顺序”的编码。使用 ByteBuffer,您可以使用 ByteOrder。

zip 文件有 NIO 替代方案吗?

【问题讨论】:

  • zip 文件中的数据是压缩格式,因此更改字节顺序是没有意义的。正如您在问题中所写,首先解压缩,然后换入字节以更改它们的字节序。
  • 你不需要这些。使用 JDK 中提供的ZipInputStream。你从错误的地方开始,你当然不必处理 ZIP 文件中的字节序问题。
  • @EJP- 字节序问题不在 ZIP 文件中。它们在未压缩的文件中。很抱歉,如果文字表达的问题不够准确。

标签: java zip inputstream


【解决方案1】:

如果您有ZipInputStream,只需使用Channels.newChannel 将其转换为Channel,然后按照您的意愿继续操作。但是您应该记住,ZipInputStream 可能无法预测其未压缩的大小,因此您可能不得不猜测适当的缓冲区大小,并可能在需要时重新分配更大的缓冲区。而且,由于底层 API 使用字节数组,在 ZipInputStream 的情况下使用 direct ByteBuffers 没有任何好处,即我建议使用 ByteBuffer.allocate 而不是 ByteBuffer.allocateDirect用例。

顺便说一句,您可以将while(bb.remaining() > 0) 替换为while(bb.hasRemaining())。从 Java 7 开始,您可以使用FileChannel.open 打开FileChannel,而无需通过FileInputStream 绕道。

【讨论】:

  • 在所有回答的人中,只有你明白我的问题!也感谢代码审查!!
猜你喜欢
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多