今天突然遇到一个问题,通过下载文件的接口下载的文件比实际文件小了2kb,而且文件中的内容比实际内容少了很多,带着这个问题,我跟踪代码执行流程,我们来看一下核心代码:
bis = new BufferedInputStream(new FileInputStream(targetFilePath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
核心代码非常简单,就是根据目标文件,通过FileInputStream流来读取目标文件流,写入到response的输出流中。中间通过BufferedInputStream和BufferedOutputStream缓冲流来提高性能。 根据上述代码,我大胆猜测可能出现问题的原因是BufferedInputStream或者BufferedOutputStream。进一步分析:
while (-1 != (bytesRead = bis.read(buff, 0, buff.length)))
该语句是循环读取所有读缓冲区的内容,因此,该语句出现问题的几率不是很大,很大可能是因为写缓冲区的问题,下面我通过分析BufferedOutputStream的源码来看看