我刚刚发布了一个(半似的)问题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(应该是)。
请帮助,这里可能出现的错误或情况是什么?!
提前感谢。
答案 0 :(得分:1)
这是基本的IO。 read(byte[])
的{{1}}方法无法保证读取完整数据的整个字节数组。这就是它返回读取的实际字节数的原因。
InputStream
确实有一个DataInputStream
方法,可以完全填充数组。