随笔 - 266,  文章 - 1,  评论 - 66,  阅读 - 85万

情景描述:

  1.将本地数据备份成zip文件;

  2.将备份的zip文件通过sftp上传到文件服务器;

  3.将文件服务器上的zip文件下载到运行服务器;

  4.将下载的zip文件解压到本地(文件大小超过50KB时报文件被损坏);

 

分析:

  既然报文件被损坏,肯定就是因为下载文件时文件没有读取完全。

程序肯定不会骗人,但是当时在解决这个问题的时候,就是不愿意相信是下载的问题,因为文件确实是下载下来了,而且流也关闭了,也提示下载成功了,所以就去怀疑是程序存在的问题,这是很不应该的。

 

问题代码:

         byte[] b = new byte[10*1024];
            while(download.getInputStream().read(b,0,10240) != -1){
              fos.write(b,0,10240);
            }

结论:

  对于影像、流等应该按照字节来读取,而不应该一下读取多个字节,这样容易少读取文件,造成文件损坏。

 

后补:

不好意思,只分析了问题,没有写解决方法,现在给出来解决方案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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();
    }
}

  

posted on   风又奈何  阅读(18110)  评论(11编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示