是否有任何高性能文件解析的设计模式?

时间:2014-12-06 16:52:46

标签: java file parsing binary

我最近开发了自己的文件解析类BufferedParseStream,并使用它来解码PNG图像。我一直在将它的性能与开源项目PNGJ进行比较,并且已经看到,对于较小的图像尺寸,PNGJ的速度可以达到我自己实现的两倍。我假设这与使用BufferedInputStream时的实现开销相关联,因为PNGJ会改为使用equivalent

是否存在指导高性能文件解析的现有设计模式,如intfloat等原语?

public class BufferedParseStream extends BufferedInputStream {

private final ByteBuffer  mByteBuffer;

public BufferedParseStream(final InputStream pInputStream, final int pBufferSize) {
    super(pInputStream, pBufferSize);
    /* Initialize the ByteBuffer. */
    this.mByteBuffer  = DataUtils.delegateNative(new byte[8]);
}

private final void buffer(final int pNumBytes) throws IOException {
    /* Read the bytes into the ByteStorage. */
    this.read(this.getByteBuffer().array(), 0, pNumBytes);
    /* Reset the ByteBuffer Location. */
    this.getByteBuffer().position(0);
}

public final char parseChar() throws IOException {
    /* Read a single byte. */
    this.buffer(DataUtils.BYTES_PER_CHAR);
    /* Return the corresponding character. */
    return this.getByteBuffer().getChar();
}

public final int parseInt() throws IOException {
    /* Read four bytes. */
    this.buffer(DataUtils.BYTES_PER_INT);
    /* Return the corresponding integer. */
    return this.getByteBuffer().getInt();
}

public final long parseLong() throws IOException {
    /* Read eight bytes. */
    this.buffer(DataUtils.BYTES_PER_LONG);
    /* Return the corresponding long. */
    return this.getByteBuffer().getLong();
}

public final void setParseOrder(final ByteOrder pByteOrder) {
    this.getByteBuffer().order(pByteOrder);
}

private final ByteBuffer getByteBuffer() {
    return this.mByteBuffer;
}

}

1 个答案:

答案 0 :(得分:1)

Java nio应该比使用输入流更快,你提出的类对我来说似乎很奇怪(可能只是我:) :)因为它在ByteBuffer之上有一个额外的层,我认为不需要。

您应该直接使用字节缓冲区,它有一个getInt,getFloat方法,您可以直接将其提供给所需的变量。

我认为虽然你的性能问题可能出现在PNG解码器代码中,正如其他人已经提到的那样。你应该发布它以供进一步分析