Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedRead在Linux和Windows上读取二进制文件的方式不同_Java_Linux - Fatal编程技术网

Java BufferedRead在Linux和Windows上读取二进制文件的方式不同

Java BufferedRead在Linux和Windows上读取二进制文件的方式不同,java,linux,Java,Linux,我正在编写一个Java程序来对一个二进制文件进行后期处理,该文件包含一个或多个测试数据包,其中包含不同数量的数据 数据。我使用BufferedReader对象解析二进制文件。因为我的程序的目的是更新数据包 大小,我解析数据包,直到到达数据包头“Test”指示的下一个数据包 我的程序在我的Windows7电脑上运行良好,但由于某些原因,它不能在我的Linux机器上运行。事实并非如此 正确查找和读取数据包的方式与我的电脑相同,但我不确定原因 我试过两种方法: private fina

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

我的程序在我的Windows7电脑上运行良好,但由于某些原因,它不能在我的Linux机器上运行。事实并非如此 正确查找和读取数据包的方式与我的电脑相同,但我不确定原因

我试过两种方法:

        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;
            }
        }

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

经理说:

字符输入流读取文本

短信!不是二进制的

例如,使用a代替

或者完全转到java.nio并使用a(看看它提供了什么——例如,您有一个
.asCharBuffer()
来读取
char
s,您还可以更改endianness)

缓冲读取二进制文件


停在那里。三个字的问题,这是已经错了。读卡器用于文本文件。不要在你不知道是文本的任何东西上使用它们。

如果你在Win7上使用它们并打印出结果文件的二进制文件,那么这与在Linux上创建的二进制结果文件的相同打印输出有何不同?首先写文件的是什么?是java代码吗?@ TrTunman C++程序正在编写二进制文件。这可能是你的问题,至少如果CPU不同的架构,这是可能的问题,但是这可能是问题所在。另外,在逐字节读取数据时,为什么要使用缓冲区?@TritonMan问得好。。。这就是我在任何情况下使用nio的原因:我总是可以从任何
ByteBuffer
;)实例化
*流@TritonMan在任何上下文(I/O、图形等)中的缓冲都旨在提高性能。假设您有一个1024字节的缓冲区。需要一次顺序读取。如果没有缓冲区,则需要1024次读取(尽管操作系统可能会自行执行一些优化)。尝试计时在BufferedInputStream中读取500 MB文件(有或没有包装FileInputStream)所需的时间;带缓冲区的总是更快的。@使用mmap()带缓冲区的文件rob这没关系,因为操作系统会为您进行缓冲。。。菲利海峡岩石@fge我只是回答“在逐字节读取时为什么要使用缓冲?”但是,是的,我没有说明将内存映射文件的InputStream包装到BufferedInputStream中不一定会获得性能优势。
        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;
}