在使用BufferedInputStream读取字节流是,若最后剩余的字节数,小于指定读取的字节数,则返回的字节数组的内容长度仍然是指定的字节数,这时若写入新的文件,或者写
入socket时,则会出现目标文件比原文件多几个字节,并不是和原文件一模一样的大小。下面的例子可以完美的解决这个问题。^_^
@Override
public void run() {
try {
FileInputStream fis = null;
BufferedInputStream bis = null;
fis = new FileInputStream(filepath);
if (fis != null) {
bis = new BufferedInputStream(fis);
}
if (bis != null) {
byte[] bs = new byte[512];
while(bis.available() > 512) {
bis.read(bs);
ByteBuffer src = ByteBuffer.wrap(bs);
// write data to client socket channel
lsockChannel.write(src);
Arrays.fill(bs, (byte)0);
}
// 处理不足512的剩余部分
int remain = bis.available();
byte[] last = new byte[remain];
bis.read(last);
lsockChannel.write(ByteBuffer.wrap(last));
bis.close();
fis.close();
lsockChannel.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}