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

发布于 2024-12-15 15:54:40 字数 617 浏览 1 评论 0 原文

在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...

}       

Is there a more efficient way to break the data in a byte array in Java?
I have written the following function to read a binary file with fixed length data field. But the performance are really slow, I need to read a binary file with 30,000 records each with the length of 300 bytes, and each record contain 240 fields.
Any advise?

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...

}       

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怀里藏娇 2024-12-22 15:54:40

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

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

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

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

By reading the entire file into a byte[] array, if the file is larger than the amount of space available in memory to the JVM, then you will get an OutOfMemoryError.

Instead, you can use a BufferedReader in conjunction with a FileReader. This will allow you to read the file piece by piece without loading the entire thing into memory.

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

To load the data record-by-record, simply read in 300 bytes at a time when you call BufferedReader.read. If you prefer to deal with individual fields, instead of reading 300 bytes at a time, just read the number of bytes that corresponds to the length of the next field.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文