jar文件中奇怪的IO操作行为

时间:2013-12-10 08:56:10

标签: java eclipse io

我刚刚发布了一个(半似的)问题here,我一般都会问这个问题,但我遇到了问题,这是一个IO问题。

在我们的程序中,我们必须读取一个文件(大约10MB)并解密它,我正在使用以下类。

class FileStream extends InputStream {
  public int available() throws IOException {
    return baseStream.available();
  }
  public boolean markSupported() {
    return false;
  }
  InputStream baseStream;
  byte[] data = new byte[1048576];
  int loopRead = 0;
  int streamSize;
  int dataRead;
  public FileStream(InputStream is) throws Exception {
    this.baseStream = is;
    streamSize = is.available();
  }
  public int read() {
    if (dataRead == streamSize) {
      return -1;/* End of the stream */
    }
    dataRead++;
    if (loopRead == data.length) {
      decrypt();
    }
    return data[loopRead++];
  }
  byte[] tempRead = new byte[4096];// block(smallest) decryption size
  void decrypt() {
    try {
      int r;
      for (int i = 0; i < (data.length / tempRead.length); i++) {
        System.out.print("Data Available: "+baseStream.available());
        r = baseStream.read(tempRead);// read from base stream, ERROR IS HERE!
        System.out.print("Data read: "+r);//not always 4096 in jar file, vary numbers!
        if (r <= 0) {
          return;
        }
        System.arraycopy(tempRead, 0, data, (i * tempRead.length),
            tempRead.length);
      }// end-for
      // /////decrypt the data////////
      loopRead = 0;
    } catch (Exception ex) {
    }
  }
}
当我从eclipse运行它时

WORKS ,但是当我生成JAR文件(导出)并从命令行(java -Xmx1280M -jar app.jar)运行它时,它没有' t读取数据正确。

块大小(crypt块大小)是4096,所以文件的大小可以被4096分割,我真的不知道为什么会这样!它应该每次读取4096个字节的数据,但它不会,并且数据可用性总是超过4096(应该是)。

请帮助,这里可能出现的错误或情况是什么?!

提前感谢。

1 个答案:

答案 0 :(得分:1)

这是基本的IO。 read(byte[])的{​​{1}}方法无法保证读取完整数据的整个字节数组。这就是它返回读取的实际字节数的原因。

InputStream确实有一个DataInputStream方法,可以完全填充数组。