从二进制输入流中读取可变数据长度的最有效方法是什么

时间:2015-06-23 14:19:05

标签: java

我正在使用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;
                  }
              }

4 个答案:

答案 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[]。这将使读取数量显着减少,这就是为什么它的速度要快得多。