`

java 实现文件复制的两种方式

    博客分类:
  • java
 
阅读更多
  文件复制首先我们要考虑的是用字符流还是文件流操作呢?
    若我们考虑的仅仅是文本之类的复制,字符流要好些。但是不可能总是文本文件吧,有可能是声音,图像,视频等等,所以使用字节流操作比较好。
    复制的两种方式
      1.将源文件中的内容全部读取到内存中,并一次性写入到目标文件
      2.不将源文件中的内容全部读取到内存中来,而是采取边读边写的方式
下面就是采用这两种方法对比
 package zzs.file.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileCopy {
	private File inputFile;
	private File outputFile;
	private InputStream inputStream;
	private OutputStream outputStream;
	public FileCopy(String inputPath,String outputPath) throws FileNotFoundException{
		inputFile=new File(inputPath);
		outputFile=new File(outputPath);
		inputStream=new FileInputStream(inputFile);
		outputStream=new FileOutputStream(outputFile);
		
	}
	//一次性把数据全部读取到内存中来,再一次性写入
	public void copy1() throws IOException{
		byte b[]=new byte[(int)inputFile.length()];
		inputStream.read(b);       //一次性读入
		outputStream.write(b);   //一次性写入
//		inputStream.close();
//		outputStream.close();
	}
	//边读边写
	public void copy2() throws IOException{
		int temp=0;
		while((temp=inputStream.read())!=-1){
			outputStream.write(temp);
		}
		inputStream.close();
		outputStream.close();
	}
	
	public File getInputFile() {
		return inputFile;
	}
	public void setInputFile(File inputFile) {
		this.inputFile = inputFile;
	}
	public File getOutputFile() {
		return outputFile;
	}
	public void setOutputFile(File outputFile) {
		this.outputFile = outputFile;
	}
	public static void main(String[] args) throws IOException{
		String inputPath="e:"+File.separator+"Xfire.rar";
		String outputPath="f:"+File.separator+inputPath.substring(inputPath.indexOf(File.separator));
		FileCopy fileCopy=new FileCopy(inputPath, outputPath);
		long start1=System.currentTimeMillis();
		fileCopy.copy1();
		long end1=System.currentTimeMillis();
		System.out.println("一次性全部读入内存复制文件大小为"+fileCopy.getInputFile().length()+"位花费时间为:"+(end1-start1)+"ms");
		
		
		fileCopy.getOutputFile().delete();
		long start2=System.currentTimeMillis();
		fileCopy.copy2();
		long end2=System.currentTimeMillis();
		System.out.println("边读边写复制文件大小为"+fileCopy.getInputFile().length()+"位花费时间为:"+(end2-start2)+"ms");
	}

}

   经测试发现,对于读取文件的大小小于自身机器的内存时,采取方式1要比方式二快很多,但是若读取的文件大于自身内存则方式二好些。不过在这种情况下有更好的方式就是采取缓冲机制,读取一块,写入一块。结合了一和二的优点。
0
4
分享到:
评论

相关推荐

    Java实现文件拷贝的方法

    java有两种文件流的  字符流:Reader/Writer 字节流:InputStream/OutputStream  如果文件不是普通的文本类型的话,不能使用字符流了,所以通用的文件流还是字节流。这里使用字节流实现文件拷贝。  使用java....

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    文件上传两种方式的代码

    文件上传的两种处理方式的代码,复制即可使用. 感谢您的下载 能帮助到您是我的荣幸 很开心 我会继续努力的加油 我会变厉害的

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java 操作CSV文件类

    CSV是一种结构化的文本文件,可以看做是二维表,构成规则如下:每一行(“\r\n”标志行结束)对应表格的一行,不同列之间使用逗号分隔;如果列内容中包含逗号,则使用双引号将整列包裹起来;如果列内容中包含双引号,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    HDFS两种操作方式:命令行和Java API

    HDFS 文件操作有两种方式:一种是命令行方式,Hadoop 提供了一套与 Linux 文件命令类似的命令行工具;另一种是 Java API,即利用 Hadoop 的 Java 库,采用编程的方式操作 HDFS 的文件。 本节将介绍 Linux 操作系统中...

    JAVA 对word 内容的提取返回String

    JAVA 对word 内容的提取返回String 的代码 两种方式详细的资源描述有机会获得我们的推荐,更有利于他人下载,赚取更多积分

    基于JAVA的RSA文件加密软件的设计与实现.zip

    我们使用的加密类型分为两种密钥-- 一种是公共密钥,一种是私人密钥。 您发送信息给我们时,使用公共密钥加密信息。 一旦我们收到您的加密信息,我们则使用私人密钥破译信息密码。 同一密钥不能既是加密信息又是...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    java 面试题 总结

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byte...

    Java中复制文件的效率测试

    项目中用到了图片的上传,对于上传过程中,图片的复制项目组用了两种方法,一种是以java的IO流,另外一种是用org.apache.commons.io.FileUtils的工具类,我测试了一下,单纯考虑文件的复制效率,apache的工具类的...

    用Java写的报表.

    支持文本方式和全格式两种方式。剪贴也允许在两个应用之间进行。可以从EXCELL单元格中复制到本应用中。 14.单元格线,滚动条,行头,列头显示可选. 15.支持公式定义,公式定义采用?作标记,如?sum(A1:B1)。 16.数字...

    java面试题

    84.6. 内部类的实现方式? 112 84.7. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

Global site tag (gtag.js) - Google Analytics