2

我需要将二进制文件中的数据作为十六进制字符串提供。当前的实现将整个文件加载到内存中,将其转换为十六进制字符串,并将十六进制字符串作为字节数组提供给另一个组件。

我现在面临的问题是这个文件有时非常大,所以我得到“OutOfMemoryException”。该组件还接受 InputStream 作为输入,所以我想我会将 FileInputStream 包装到另一个流中,该流将文件作为十六进制字符串返回。

但是我不确定如何做到这一点,虽然子类化 InputStream 看起来很简单,但我可以看到这在不同的读取方法和特殊情况下非常容易出错。如果这个轮子已经存在并且我不必重新发明它,那也很好。

建议?

4

3 回答 3

2

这是基本思想

class HexInputStream extends FilterInputStream {

    HexInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read(byte[] buff, int off, int len) throws IOException {
        int b = super.read();
        String hex = String.format("%02x", b);
        buff[0 + off] = (byte)hex.charAt(0);
        buff[1 + off] = (byte)hex.charAt(1);
        return 2;
    }
}

我们创建一个 InputStream

InputStream is = new BufferedInputStream(new HexInputStream(new FileInputStream("1.test")));

并将其传递给组件。在 is.read 上,我们总是读取 1 个字节并将其转换为 2 个十六进制字符。

要使这个想法真正发挥作用需要付出一些努力。

于 2013-03-21T12:13:46.320 回答
1

您应该通过扩展FilterInputStream(或FilterReader)和覆盖相关的读取方法和您想要的其他方法来实现这一点。例如,该read()方法需要读取一个字节,将其转换为两个十六进制字节,返回第一个字节,并保留第二个字节以供下次read()调用。

于 2013-03-21T11:44:39.053 回答
0

Apache Commons IO 为您的问题提供了一个实用程序,它还尝试涵盖复杂的 IO 场景。这是链接

来自 apache commons 的 hexdump

希望这可以帮助

于 2013-03-21T11:20:07.683 回答