java文件复制之根据文件大小复制
2017-03-28 08:15
309 查看
在java开发中,经常会碰到文件复制的问题。最常用的方式是利用byte数组来完成,如下:
final intMAX_BUFFER_LENGTH = 1024;
FileOutputStream fos = new FileOutputStream(destFile);
FileInputStream fis = new FileInputStream(srcFile);
byte[] bytes = new byte[MAX_BUFFER_LENGTH];
int len = 0;
try{
while((len = fis.read(bytes)) != -1){
fos.write(bytes, 0, length);
}
}catch(Eception e){
System.out.println("复制文件失败!" + e.printStackTrace());}finally{
fos.close();
}
这种方式看似简单实用,其实不然。原因在于:
len = fis.read(bytes),它表示从fis中读取bytes大小的内容。如果循环的最后一次复制fis中并没有足够的内容,那么bytes数组中剩下的内容肯定为null,可怕的是这些null也会被复制到fos中。所以这种方式复制文件就相当于最终得到的文件大小一定是bytes数组大小(MAX_BUFFER_LENGTH)的整数倍,可能无意间增加了复制内容。
不过还好有另一种经常使用的文件复制方式可以解决这一问题-----FileChannel
FileChannel inputChannel = null;
FileChannel outputChannel = null; try{
outputChannel = new FileOutputStream(destFile).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
}finally{
inputChannel.close();
outputChannel.close();
}
inputChannel = new FileInputStream(file).getChannel();
这种方式是根据inputChannel的大小来复制文件,避免了复制的内容无意增多的问题。这种问题一般情况下没有
影响,但是如果复制过去的文件是需要给程序处理的,这就有可能造成无法解析的现象。
当然,java中对文件的复制方式不止这两种,这篇文章的目的在于提出上诉问题,以免在今后的编码过程中再次
出现同样的问题!
final intMAX_BUFFER_LENGTH = 1024;
FileOutputStream fos = new FileOutputStream(destFile);
FileInputStream fis = new FileInputStream(srcFile);
byte[] bytes = new byte[MAX_BUFFER_LENGTH];
int len = 0;
try{
while((len = fis.read(bytes)) != -1){
fos.write(bytes, 0, length);
}
}catch(Eception e){
System.out.println("复制文件失败!" + e.printStackTrace());}finally{
fos.close();
}
这种方式看似简单实用,其实不然。原因在于:
len = fis.read(bytes),它表示从fis中读取bytes大小的内容。如果循环的最后一次复制fis中并没有足够的内容,那么bytes数组中剩下的内容肯定为null,可怕的是这些null也会被复制到fos中。所以这种方式复制文件就相当于最终得到的文件大小一定是bytes数组大小(MAX_BUFFER_LENGTH)的整数倍,可能无意间增加了复制内容。
不过还好有另一种经常使用的文件复制方式可以解决这一问题-----FileChannel
FileChannel inputChannel = null;
FileChannel outputChannel = null; try{
outputChannel = new FileOutputStream(destFile).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
}finally{
inputChannel.close();
outputChannel.close();
}
inputChannel = new FileInputStream(file).getChannel();
这种方式是根据inputChannel的大小来复制文件,避免了复制的内容无意增多的问题。这种问题一般情况下没有
影响,但是如果复制过去的文件是需要给程序处理的,这就有可能造成无法解析的现象。
当然,java中对文件的复制方式不止这两种,这篇文章的目的在于提出上诉问题,以免在今后的编码过程中再次
出现同样的问题!
相关文章推荐
- Java IO 目录文件复制与删除以及目录大小与文件个数统计
- 根据文件大小显示文件复制进度条
- java复制文件的一个小例子(实现根据图片上的内容给图片重命名)
- c#根据文件大小显示文件复制进度条实例
- Qt 实现文件复制 界面有进度条(根据文件大小)显示复制进度,
- java中对文件的一些操作(删除,复制,计算大小..)和一些数学问题代码详解
- c#根据文件大小显示文件复制进度条实例
- 根据URL从服务器端复制文件到本地java代码
- java中文件复制得速度测试
- JAVA 如何创建/删除/修改/复制目录及文件
- JAVA文件复制
- java操作文件(创建、删除、复制、剪切)
- java中获得当前文件大小
- JAVA 如何创建/删除/修改/复制目录及文件
- java中文件复制得速度测试
- java根据properties配置文件来实现功能模块的动态切换
- 根据FileUpload控件名获取上传文件(大小)类型
- JAVA多线程复制文件
- java文件上传和下载(原创,根据RFC1867分析得到)
- JAVA 如何创建/删除/修改/复制目录及文件