事情的起因是这样的
我这边写了个批量导出csv文件,经过各种测试没问题。然后,功能上线了,用同事写的下载接口。
下载下来傻眼了?文件是空白的。真惊出了一身冷汗,各种排查,各种本地复现,我靠,没问题呀。
文件都是正常的。(不对,一定有猫腻)
自己又想了想,我自己测,都是在磁盘看的,没有经过同事的下载。而线上是经过同事的下载搞下来的。
我靠,我感觉问题已经在那里了,这坑货。绝对下载功能有问题呀。然后去排查下载功能。说理说,下载
功能很简单,不应该呀。看了看,一个简单的下载功能,他竟然网关调web模块,web模块又调业务模块
我服了,搞这么复杂干毛线呀。直接网关调业务模块不就行了。我让他改。
然后,他改了,他说这回绝对没问题了。
难道事情就这么简单结束了?
又开开心心上线了,这下总没有问题了吧。然后,下载下来文件,哇,好开心,竟然有东西了。这回,
同事没有骗我。打开文件,看着数据好像也没啥问题了。心里也暗暗放松了。看到了文件的最后,我靠?
多了几行数据?难道我写的导入有问题?又是一顿排查,又是一顿本地复现和测试。靠,没问题呀。难道
还是同事的下载。fuck,再去看一波,不看不知道一看。靠。
这是同事的下载代码
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int read = bis.read(buffer);
while (read != -1) {
os.write(buffer);
read = bis.read(buffer);
}
你们看到问题了么?
os.write(buffer);
关键就是这一行,这样肯定是不对的呀。到了最后,buffer可能不是满的呀。这就刷多了数据呀。
简单地说就是,buffer缓冲1024个字节,等到了最后,我就剩一个字节的数据需要写入文件
然后,buffer缓冲区就把这第一个字节替换了,后面的1023个字节还是上一次操作残留的。
这样文件的结尾就多了1023个字节的数据。
应该替换成
os.write(buffer,0,read);
这样才对。哎,被同事坑死了。真的服。