【发布时间】:2014-09-07 14:32:24
【问题描述】:
老兄,我正在使用以下代码来读取一个大文件(2MB 或更多)并处理一些数据业务。
我必须为每个数据读取调用读取 128Byte。
一开始我用这个代码(没问题,效果很好)。
InputStream is;//= something...
int read=-1;
byte[] buff=new byte[128];
while(true){
for(int idx=0;idx<128;idx++){
read=is.read(); if(read==-1){return;}//end of stream
buff[idx]=(byte)read;
}
process_data(buff);
}
然后我尝试了出现问题的代码(错误!有时反应很奇怪)
InputStream is;//= something...
int read=-1;
byte[] buff=new byte[128];
while(true){
//ERROR! java doesn't read 128 bytes while it's available
if((read=is.read(buff,0,128))==128){process_data(buff);}else{return;}
}
上面的代码并不是一直有效,我确定数据的数量是可用的,但有时会读取(read) 127 或 125 或 123。什么问题?
我还找到了一个使用 DataInputStream#readFully(buff:byte[]):void 的代码,它也可以工作,但我只是想知道为什么秒解决方案在数据可用时不填充数组数据。
谢谢朋友。
【问题讨论】:
-
只是一个旁注:空白不花费 nuthin',但糟糕的代码易读性可能会花费很多。考虑将每个代码语句放在自己的行上。它至少值得这么多。
-
您知道,使用第二个代码块,您会丢弃数据。如果由于某种原因没有读取 128 个字节,例如,您已经到达数据的末尾,并且只读取了部分缓冲区,如果该缓冲区被丢弃。我自己,我会使用 BufferedInputStream。
-
-
API里都有,请阅读。