`
magicmind
  • 浏览: 74984 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

使用java进行文件复制

    博客分类:
  • java
阅读更多

     文件复制的过程很简单,从源文件读出数据,再写到目标文件就实现了文件复制,java强大的I/O实现起来很简单,下面是一个文件copy方法:

    public static void copy2(String src, String dest) {
        int readBufferSize = 4096;
        File from_file = new File(src);
        File to_file = new File(dest);

        FileInputStream from = null;  // Stream to read from source
        FileOutputStream to = null;   // Stream to write to destination
        try {
            from = new FileInputStream(from_file);  
            to = new FileOutputStream(to_file);     
            byte[] buffer = new byte[readBufferSize];
            int bytes_read;                         
           
            while((bytes_read = from.read(buffer)) != -1) 
                to.write(buffer,0,bytes_read);          
        }
        finally {
            if (from != null)
            	try {
            		from.close(); 
            	}catch(IOException e){
            		from = null;
            		e.printStackTrace();
            	}
            if (to != null)
            	try {
            		to.close();
            	} catch (IOException e){
            		to = null;
            		e.printStackTrace();
            	}
        }
    }

 

下面改进一下,用带缓冲的输入输出流:

    public static void copy2(String src, String dest) {
		int readBufferSize = 4096;
		File from_file = new File(src);
		File to_file = new File(dest);

		BufferedInputStream bisFrom = null; // Stream to read from source
		BufferedOutputStream bisTo = null; // Stream to write to destination
		try {
			bisFrom = new BufferedInputStream(new FileInputStream(from_file));
			bisTo = new BufferedOutputStream(new FileOutputStream(to_file));
			byte[] buffer = new byte[readBufferSize]; // byte buffer
			int bytes_read;

			while ((bytes_read = bisFrom.read(buffer)) != -1)
				bisTo.write(buffer, 0, bytes_read);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bisFrom != null)
					bisFrom.close();
				if (bisTo != null)
					bisTo.close();
			} catch (IOException e) {
				bisFrom = null;
				bisTo = null;
			}
		}
	}

 除了使用java传统的I/O 外,使用nio包里FileChannel类也可以很方便的实现文件复制,下面是一个使用FileChannel的方法:

    public static void copyFile(String src, String dest) {
		File srcFile = new File(src);
		File destFile = new File(dest);
		FileChannel sourceChannel = null;
		FileChannel destinationChannel = null;

		try {
			sourceChannel = new FileInputStream(srcFile).getChannel();
			destinationChannel = new FileOutputStream(destFile).getChannel();
			sourceChannel.transferTo(0, sourceChannel.size(),destinationChannel);
			// or
			// destinationChannel.transferFrom(sourceChannel,0,sourceChannel.size());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (sourceChannel != null)
					sourceChannel.close();
				if (destinationChannel != null)
					destinationChannel.close();
			} catch (IOException e) {
				sourceChannel = null;
				destinationChannel = null;
			}
		}

	}
    

 使用FileChannel果然简单,一个方法就ok了,那么上面三种方法实现的文件复制速度一样快吗?如果不一样,哪种方式的效率更高一些呢?一般会认为nio具有更高的效率,那FileChannel会不会更快一些呢?实践一下便知。

目标文件选用一个689M大的iso文件,从一个磁盘分区复制到另外一个分区

系统环境: cpu:E2160,内存:单条2G,操作系统:windows xp sp2,JDK1.6.10

测试结果:

方法1 耗时33204毫秒,方法2 耗时23781毫秒,方法3 耗时53859毫秒

实测的结果是FileChannel最慢,而且竟然比文件流读写方式慢了一倍!

是不是一次传输整个文件影响效率呢,看看分段循环传输会不会好一些,把方法3改成下面的形式:

    public static void copyFile2(String src, String dest) {
		File srcFile = new File(src);
		File destFile = new File(dest);
		FileChannel sourceChannel = null;
		FileChannel destinationChannel = null;
		long buffer = 4096;
		long byteWritten = 0;

		try {
			sourceChannel = new FileInputStream(srcFile).getChannel();
			destinationChannel = new FileOutputStream(destFile).getChannel();
			long filesize = sourceChannel.size();
			while (byteWritten < filesize) {
				long written = sourceChannel.transferTo(byteWritten, buffer,destinationChannel);
				byteWritten += written;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				sourceChannel.close();
				destinationChannel.close();
			} catch (IOException e) {
				sourceChannel = null;
				destinationChannel = null;
			}
		}
	}

 再做测试,成绩为:31344毫秒 ,果然比一次传输的方式快了不少,速度基本和文件流读写方式持平。

 

从实际测试结果可以看出,对于比较大的文件,FileChannel循环传输的方式比一次传输速度快,和FileInputStream/FileOutputStream的速度相当,而带缓冲的流读写速度最快。

分享到:
评论

相关推荐

    java文件复制(全)

    以上就是使用Java进行文件复制的基本知识,包括单个文件的复制和整个文件夹的复制。在实际应用中,可能还需要考虑错误处理、文件权限、网络文件复制等复杂情况,但这些基础操作为理解和处理这些问题提供了起点。

    java文件复制,实现文件的复制

    在进行文件复制之前,我们先回顾一下Java中处理文件的基本概念: 1. **`java.io.File`**:用于表示文件或目录路径,可以获取文件属性,如文件大小、最后修改时间等。 2. **`java.io.InputStream`** 和 **`java.io....

    java_文件复制(带有编码类型)

    "Java 文件复制(带有编码类型)" 在 Java 中,文件复制是非常常见的操作。今天,我们将讨论如何使用 Java 将文件从一个位置复制到另一个位置,并且带有编码类型。 标题:Java 文件复制(带有编码类型) 描述:...

    java 文件复制

    下面将详细讲解如何使用Java进行文件复制,以及涉及的相关知识点。 首先,我们需要导入Java的`java.io`包,这个包包含了处理输入/输出流的类,是实现文件复制的关键。主要使用的类有`FileInputStream`(输入流)和`...

    java文件复制功能

    java文件复制,使用java语言开发的,效果如windows 的复制和粘贴效果。

    java文件夹及文件复制

    在实现文件复制时,我们通常会使用`BufferedInputStream`和`BufferedOutputStream`来提高效率,它们可以一次性读写多个字节,减少磁盘I/O操作的次数。 3. **递归复制文件夹**:当需要复制一个文件夹及其所有子...

    java复制文件的4种方式

    本文将详细介绍四种常见的Java文件复制方法:使用`FileStreams`、使用`FileChannel`、使用Apache `Commons IO`以及使用Java 7的`Files`类。 #### 1. 使用`FileStreams`复制文件 这种方法是最传统的文件复制手段,...

    java复制文件代码

    ### 一、Java文件复制的基本原理 在Java中,复制文件通常涉及到读取源文件的内容,并将其写入到目标文件的过程。这个过程可以通过多种方式实现,包括使用`FileInputStream`和`FileOutputStream`、`Files.copy()`...

    java简单的文件复制粘贴

    Java 文件复制粘贴是指使用 Java 语言实现文件的复制和粘贴操作。在本节中,我们将介绍 Java 文件复制粘贴的实现方法。 文件复制粘贴的重要性 文件复制粘贴是计算机操作系统中的一种基本操作。它可以将文件从一个...

    java 使用IO流实现文件的复制

    例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio.channels.FileChannel; import java.nio.file.StandardOpenOption; public class CopyFileWithNIO { ...

    java实现文件复制

    使用java创建文件并复制到另一个文件中

    java文件复制器

    一个简单的基于java实现的文件复制器,分享给大家学习

    文件复制(java代码实现)

    在Java编程语言中,文件复制是一项...这样,你就成功地使用Java实现了文件复制功能,并在DOS环境中运行了该程序。注意,为了确保程序正常运行,你需要确保源文件存在,目标文件路径是可写的,且具有适当的文件权限。

    高效率文件复制java版

    本资源主要讲解了高效率文件复制的java实现方法,包含了两种不同的实现方式,分别使用java io流和FileChannel来实现文件复制操作。 知识点1:Java IO流文件复制 在第一个实现方法中,我们使用了Java IO流来实现...

    Java文件夹复制(远程复制(网络传输),用于远程备份文件)

    这可以通过计划任务或定时器实现,确保在特定时间点执行文件复制操作。 - **版本控制**:为了便于回滚到历史版本,备份系统还应考虑保留多个备份版本,以便在需要时恢复到特定时间点的数据状态。 5. **完整性校验*...

    java实现excel表格文件的复制

    java实现excel表格文件的复制,测试可用,将excel表格的表头和内容拷贝到新表中

    JAVA小程序

    本文将基于提供的代码片段来详细解析如何使用Java进行文件复制,包括文本文件与二进制文件(如图片)的复制方法。 #### 一、文本文件复制 首先来看文本文件的复制过程。文本文件通常是以字符流的形式进行读写的,...

    java实现文件的复制

    综上所述,Java中的文件复制可以通过多种方式进行,Stream API提供了一种更现代、更高效的解决方案,特别是在Java 8及更高版本中。在实际编程中,开发者应根据项目需求和性能要求灵活选择合适的方法。

    Java文件的复制源代码

    在标题和描述中提到的"Java文件复制源代码",主要是指如何使用Java语言来实现文件的拷贝操作。这里我们将深入探讨如何通过Java标准库API来完成文件的复制,并且特别关注使用Swing组件的情况。 首先,我们从最基础的...

    java 实现文件复制 源码

    实现简单的文件复制功能,适合java入门学习 输入输出部分

Global site tag (gtag.js) - Google Analytics