【问题标题】:Efficient way to split a byte array to map the fields in a java class object拆分字节数组以映射 java 类对象中的字段的有效方法
【发布时间】:2011-11-16 04:30:53
【问题描述】:

有没有更有效的方法在 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...

}       

【问题讨论】:

  • 尝试逐记录(每300字节)而不是逐字段读取文件,并将读取的数据拆分为稍后在内存中的数据字段

标签: java bytearray readfile


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多