我正在使用BufferedInputStream并从二进制文件中读取一些数据字段。 我有一个标题,其中包含一个我必须读取的字段,以确定我需要为下一条消息读取的字节数。所以我需要读取的数据量总是可变的。我尝试一次读取消息的整个字节数,但这有时无法读取消息的整个大小。
所以现在我只是循环并一次读取1个字节,直到我拥有整个数据消息。这似乎有效但似乎确实是读取大数据文件(50兆字节文件)的最有效方式。
从流式二进制文件中读取可变数据量的最佳方法是什么?
谢谢!
int numRead= 0;
int total =0;
int readSize =56; // actually read from header
while(numRead>=0 && total < readSize){
// reading one byte at a time
//is there any way to read bigger chunks reliably
// since file is large
numRead= this.in.read(inBytes,total ,1);
if(numRead>0){
total += numRead;
}
}
答案 0 :(得分:0)
我认为最好的解决方案是将输入流与DataInputStream合并,然后使用readByte()
方法。
DataInputStream dis = new DataInputStream(new BufferedInputStream( new FileInputStream(...
答案 1 :(得分:0)
您应该能够使用read(byte [],int,int)方法填充字节数组。
int numRead= 0;
int total =0;
int readSize =56;
while(numRead >= 0 && total < readSize) {
numRead = this.in.read(inBytes, total, readSize - total);
if(numRead > 0) {
total += numRead;
}
}
这类似于你所拥有的,但它一次不限制为1个字节。
答案 2 :(得分:0)
答案已在那里发布:java-inputstream-size Java InputStream size
例如:
int numRead= 0;
int total =0;
int readSize = 1000; //you can put an bigger value here
while(numRead>0){
numRead= this.in.read(inBytes,0,readSize);
total += numRead;
}
}
使用此方法,可以通过 readSize 字节块读取inputStream。
注意:此方法只能读取大小。字节数组将只包含在上一次迭代期间获得的字节,因为我们每次将偏移量设置为0时都会覆盖它。另一点是你必须创建一个字节数组,其大小为(至少) readSize < / em>的
最后,有一些API可以将从inputStream中获取所有字节的过程转换为像 commons-io 这样的字节数组。见this answer
答案 3 :(得分:0)
如果您只是想有效地阅读文件
final int BUFFER_SIZE = 1 << 10;
try {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(fileName),BUFFER_SIZE);
int bytesRead = 0;
int bytesToRead = 1;
byte[] bytes = new byte[BUFFER_SIZE];
while((bytesRead = in.read(bytes)) != -1){
doSomethingWithContent(bytes,bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
每次读取时,这会将BUFFER_SIZE
个字节读入byte[]
。这将使读取数量显着减少,这就是为什么它的速度要快得多。