java文件下载文件损坏_java上传并下载以及解压zip文件有时会报文件被损坏错误分析以及解决...

情景描述:

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);

}

结论:

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

后补:

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

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();

}

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值