java下载文件的一个坑点(下载的文件比原文件大,多了几行)

13 篇文章 1 订阅
5 篇文章 0 订阅
事情的起因是这样的
      我这边写了个批量导出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);
这样才对。哎,被同事坑死了。真的服。
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值