使用字节流复制文件过程中容易导致复制的文件无法使用(如MP3文件比原来大了一千多倍且音乐无法播放)很严重的一个bug

使用BufferedInputStream和BufferedOutputStream复制文件,相信大家都已经游刃有余了,但是有一个

很严重的bug不容小觑,如以下代码:

package com.yeshide_02;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3 {
public static void main(String[] args) throws IOException {


BufferedInputStream bis = null;
BufferedOutputStream bos = null;
bis = new BufferedInputStream(new FileInputStream("D:\\b\\a\\任贤齐 - 花好月圆.mp3"));

bos = new BufferedOutputStream(new FileOutputStream("D:\\music\\任贤齐 - 花好月圆.mp3"));

byte[] bytes = new byte[1024];
int len;
while((len = bis.read()) != -1) {
bos.write(bytes, 0, len);
}
bis.close();
bos.close();
}
}

以上代码也能复制文件,但是有一个很严重的问题在于使用bis读取文件的时候bis.read()括号里面少写了

一个bytes,此时程序不会报错,但是会导致新复制的文件比原来大1024倍并且新复制的文件也无法被播

放器识别。出现的现象如下所述:


原因分析:

一、没有把定义的数组参数传进读取文件的代码小括号中,导致写文件时写了1024次,故新复制的文件

扫描二维码关注公众号,回复: 3987917 查看本文章

比原来的大了1024倍。

二、计算机内部存储的是二进制数字,原因分析一的读把错误的二进制读进来,导致二进制翻译成十进

制写出来过程中出错,最终导致文件出错无法打开。

复制其他文件格式的文件也类同,最后把bytes补上括号里面就可以正常复制文件了。

猜你喜欢

转载自blog.csdn.net/ImSeniorProgrammer/article/details/78271455