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