分割字节数组以映射java类对象中的字段的有效方法

时间:2011-11-16 04:30:53

标签: java bytearray readfile

是否有更有效的方法来破坏Java中字节数组中的数据? 我编写了以下函数来读取具有固定长度数据字段的二进制文件。但是性能非常慢,我需要读取一个包含30,000条记录的二进制文件,每条记录的长度为300字节,每条记录包含240个字段。 有什么建议吗?

public void breakField(byte[] input) {

    ByteArrayInputStream bais = new ByteArrayInputStream(input);

    byte[] tmp = new byte[2];
    bais.read(tmp);
    this.id = new String(tmp);

    tmp = new byte[4];
    bais.read(tmp);
    this.name = new String(tmp);

    tmp = new byte[8];
    bais.read(tmp);
    this.phone = new String(tmp);

    tmp = new byte[15];
    bais.read(tmp);
    this.otherInfo = new String(tmp);

    .... more fields...

}       

1 个答案:

答案 0 :(得分:2)

通过将整个文件读入byte[]数组,如果文件大于内存中可用于JVM的空间量,那么您将获得OutOfMemoryError

相反,您可以将BufferedReaderFileReader结合使用。这将允许您逐个读取文件,而无需将整个内容加载到内存中。

BufferedReader in = new BufferedReader(new FileReader("/path/to/my/file"));

要逐个记录加载数据,只需在调用BufferedReader.read时一次读取300个字节。如果您更喜欢处理单个字段,而不是一次读取300个字节,只需读取与下一个字段长度相对应的字节数。