java - BufferedRead 在 Linux 和 Windows 上以不同方式读取二进制文件

标签 java linux

我正在编写一个 Java 程序来对一个二进制文件进行后处理,该文件包含 1 个或多个测试数据包,其中包含不同数量的 数据。我使用 BufferedReader 对象解析二进制文件。由于我的程序的目的是更新数据包 大小,我解析数据包,直到到达数据包 header “测试”指示的下一个数据包。

我的程序在我的 Windows 7 PC 上运行良好,但由于某种原因它在我的 Linux 机器上无法运行。它根本不是 以与我的 PC 相同的方式正确查找和读取数据包数据,但我不确定为什么。

我都试过了:

        private final int PACKET_DATA_SIZE          = 4;
        char[] packetData = new char[PACKET_DATA_SIZE];

        while( !tempString.equals("Test") ) {
            read(br, packetData, PACKET_DATA_SIZE);
            tempString = new String(packetData);

            if ( currentLocation >= fileSize ) {
                break;
            }
        }

        while( currentLocation < fileSize ) {
            read(br, packetData, PACKET_DATA_SIZE);

            if (packetData[0] == 'T' && packetData[1] == 'e' && packetData[2] == 's' && packetData[3] == 't') {
                break;
            }
        }

两者都使用我的阅读功能:

public void read(BufferedReader br, char[] cbuf, int length) {
    try {
        br.read(cbuf, 0, length);
    } catch(IOException e) {
        e.printStackTrace();
    }
    currentLocation += length;
}           

两者在 Win7 上都可以正常工作,但在我的 Linux 机器上还是不行。 Linux 如何/为什么解释字符 在原始二进制文件中与 Windows 不同?两个二进制文件都以完全相同的方式逐字节写入。谢谢

最佳答案

javadoc for BufferedReader说:

Reads text from a character-input stream

文字!不是二进制!

例如,使用 BufferedInputStream相反。

或者完全使用 java.nio 并使用 FileChannel and map your file in memory (看看 ByteBuffer 必须提供什么——例如你有一个 .asCharBuffer() 来读取 char,你也可以改变字节顺序)

关于java - BufferedRead 在 Linux 和 Windows 上以不同方式读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115147/

相关文章:

java - 我很困惑。插入排序(基本排序,我知道)算法正在做一些我无法解释的事情

java - 不可变对象(immutable对象)生成器

linux - *.dsc 文件与 *.deb 和源代码文件的关系

linux - 如何使用sed删除文件中的第n个字符

linux - 初学者 bash 脚本的错误

java - 以编程方式在linux服务器上安装java

Java:URLConnection 如何处理完成的 TCP 连接?

java - 如何根据步数计算速度

linux - 打印具有特定扩展名的每个文件的名称

java - @Reference 字段上的 Morphia 点符号查询