BufferedReader在Linux与Windows上以不同方式读取二进制文件

时间:2013-06-14 18:35:47

标签: java linux

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

我的程序在我的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不同?两个二进制文件的写入方式与字节的字节完全相同。谢谢

2 个答案:

答案 0 :(得分:4)

javadoc for BufferedReader说:

  

字符输入流中读取文字

正文!不是二元的!

例如,使用BufferedInputStream代替。

或者全力以赴java.nio并使用FileChannel and map your file in memory(并查看ByteBuffer提供的内容 - 例如,您有一个.asCharBuffer()来阅读{ {1}} s,你也可以改变字节顺序)

答案 1 :(得分:2)

  

BufferedReader读取二进制文件

停在那儿。问题中有三个字,这是错误的。读者是用于文本文件。不要在任何你不知道是文本的东西上使用它们。