情景描述:
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(); } }