`

java 文件复制

    博客分类:
  • nio
阅读更多

使用FileInputStream+BufferedInputStream与FileOutputStream+BufferedOutputStream实现文件复制,是很多人普遍想到的一种方法。在这里,我将给出另外一种方法,使用FileChannel通道。其实,还有一些其他方法,想了解更多,清参见我转载的文章:JAVA NIO 简介

不多说,直接贴出源码:

srcFile和destFile:均为文件而非目录;

overlay:指示是否覆盖已存在目标文件。

 

package com.pluto.file;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FileCopy {
	private final int BUFFER_SIZE = 4096;

	public long bufferCopyFile(File srcFile, File destFile, boolean overlay) throws FileNotFoundException {
		if (!srcFile.exists()) {
			throw new FileNotFoundException("At path " + srcFile.getAbsolutePath());
		}

		if (destFile.exists() && overlay) {
			destFile.delete();
		}

		BufferedInputStream bufin = new BufferedInputStream(new FileInputStream(srcFile));
		BufferedOutputStream bufout = new BufferedOutputStream(new FileOutputStream(destFile));
		byte[] buffer = new byte[BUFFER_SIZE];
		long totalBytesReaded = 0;
		int bytesReaded = -1;
		try {
			while ((bytesReaded = bufin.read(buffer, 0, BUFFER_SIZE)) != -1) {
				bufout.write(buffer, 0, bytesReaded);
				totalBytesReaded += bytesReaded;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bufin.close();
				bufout.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return totalBytesReaded;
	}

	public long channelCopyFile(File srcFile, File destFile, boolean overlay) throws FileNotFoundException {
		if (!srcFile.exists()) {
			throw new FileNotFoundException("At path " + srcFile.getAbsolutePath());
		}

		if (destFile.exists() && overlay) {
			destFile.delete();
		}

		// 获取源文件和目标文件的输入输出流
		FileInputStream fin = new FileInputStream(srcFile);
		FileOutputStream fout = new FileOutputStream(destFile);
		// 获取输入输出通道
		FileChannel fcin = fin.getChannel();
		FileChannel fcout = fout.getChannel();
		long totalBytesReaded = 0;
		try{
			totalBytesReaded = fcin.transferTo(0, fcin.size(), fcout);
		}catch(IOException e){
			e.printStackTrace();
		} finally {
			try {
				fin.close();
				fout.close();
				fcin.close();
				fcout.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return totalBytesReaded;
	}
}
 

 

在本机上面做了个简单的性能测试。在下面的测试源码中,beautiful.rmvb是一个600M左右的文件

 

 

		FileCopy fileCopy = new FileCopy();
		File srcFile = new File("/home/pluto/temporary/filecopy/beautiful.rmvb");
		File destFile1 = new File("/home/pluto/temporary/filecopy/dest/b.rmvb");
		File destFile2 = new File("/home/pluto/temporary/filecopy/dest/be.rmvb");
		long totalBytes = 0;
		long start = System.currentTimeMillis();
		try {
			totalBytes = fileCopy.bufferCopyFile(srcFile, destFile1, false);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		long end = System.currentTimeMillis();
		System.out.println("bufferCopyFile: " + totalBytes + "  spend: " + (end - start));
		
		start = System.currentTimeMillis();
		try {
			totalBytes = fileCopy.channelCopyFile(srcFile, destFile2, false);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		end = System.currentTimeMillis();
		System.out.println("\nchannelCopyFile: " + totalBytes + "  spend: " + (end - start));
 

运行输出结果如下:

 

 

bufferCopyFile: 685049654  spend: 26077

channelCopyFile: 685049654  spend: 28345

 我的电脑性能一般,上面的结果只具有参考性。

1
2
分享到:
评论

相关推荐

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

    ### Java 文件复制技术详解 在Java编程中,文件复制是一项常用且重要的操作。无论是单一文件还是整个文件夹的复制,都是开发过程中常见的需求之一。本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #...

    java文件复制功能

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

    java文件复制器代码

    Java 文件复制器是一种实用程序,用于在计算机上复制文件。在这个特定的代码示例中,我们看到一个名为 `FileCopy` 的类,该类包含了复制文件的核心逻辑。下面我们将详细探讨这个程序的关键部分以及实现文件复制所...

    java文件复制(全)

    在Java编程中,文件复制是一项基础且常见的任务,无论是在日常开发还是系统集成中都扮演着重要角色。本文将深入探讨如何使用Java实现文件的复制,包括单个文件的复制和整个文件夹及其子文件的复制。 首先,我们来看...

    java复制文件的4种方式

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

    java文件复制器

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

    java文件复制

    将文件从一个文件夹复制到指定的目录,可用于服务器文件复制,只需传入文件地址以及目录地址即可完成复制

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

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

    JAVA文件复制操作

    实现文本复制操作的简易JAVA代码,适用于JAVA初学者

    JAVA文件复制

    这是JAVA SE中的文件复制的代码,很多人对于文件复制不是很理解,希望通过此代码可以帮助更多的人来理解怎么是用Java语言实现文件的复制

    java简单的文件复制粘贴

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

    java文件复制小程序

    用户输入原始文件地址。。。然后输入要复制到的目录。

    Java文件的复制源代码

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

    java复制文件代码

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

    文件复制(java代码实现)

    在Java编程语言中,文件复制是一项常见的任务,用于在不同位置之间移动或备份数据。本文将详细介绍如何在Java中实现文件复制,同时考虑到输入输出异常处理,并在DOS控制台环境中运行程序。 首先,我们需要创建一个...

    File-Operation-by-java.rar_java 文件复制_operation

    这个名为"File-Operation-by-java.rar"的压缩包包含了一个用Java实现的文件操作示例,它演示了如何进行文件复制、移动、删除以及新建等基本操作。让我们详细探讨一下这些功能的实现。 1. **文件复制**: 文件复制...

    java 实现文件复制 源码

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

    java 复制文件 io流操作

    在Java编程语言中,文件复制是一项常见的任务,主要通过IO(Input/Output)流来实现。IO流提供了从一个源读取数据并将其写入另一个目的地的机制。在这个主题中,我们将深入探讨如何使用Java的IO流进行文件复制,重点...

Global site tag (gtag.js) - Google Analytics