使用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
我的电脑性能一般,上面的结果只具有参考性。
分享到:
相关推荐
### Java 文件复制技术详解 在Java编程中,文件复制是一项常用且重要的操作。无论是单一文件还是整个文件夹的复制,都是开发过程中常见的需求之一。本文将深入探讨如何使用Java实现文件及其目录结构的完整复制。 #...
java文件复制,使用java语言开发的,效果如windows 的复制和粘贴效果。
Java 文件复制器是一种实用程序,用于在计算机上复制文件。在这个特定的代码示例中,我们看到一个名为 `FileCopy` 的类,该类包含了复制文件的核心逻辑。下面我们将详细探讨这个程序的关键部分以及实现文件复制所...
在Java编程中,文件复制是一项基础且常见的任务,无论是在日常开发还是系统集成中都扮演着重要角色。本文将深入探讨如何使用Java实现文件的复制,包括单个文件的复制和整个文件夹及其子文件的复制。 首先,我们来看...
本文将详细介绍四种常见的Java文件复制方法:使用`FileStreams`、使用`FileChannel`、使用Apache `Commons IO`以及使用Java 7的`Files`类。 #### 1. 使用`FileStreams`复制文件 这种方法是最传统的文件复制手段,...
一个简单的基于java实现的文件复制器,分享给大家学习
将文件从一个文件夹复制到指定的目录,可用于服务器文件复制,只需传入文件地址以及目录地址即可完成复制
"Java 文件复制(带有编码类型)" 在 Java 中,文件复制是非常常见的操作。今天,我们将讨论如何使用 Java 将文件从一个位置复制到另一个位置,并且带有编码类型。 标题:Java 文件复制(带有编码类型) 描述:...
实现文本复制操作的简易JAVA代码,适用于JAVA初学者
这是JAVA SE中的文件复制的代码,很多人对于文件复制不是很理解,希望通过此代码可以帮助更多的人来理解怎么是用Java语言实现文件的复制
Java 文件复制粘贴 Java 文件复制粘贴是指使用 Java 语言实现文件的复制和粘贴操作。在本节中,我们将介绍 Java 文件复制粘贴的实现方法。 文件复制粘贴的重要性 文件复制粘贴是计算机操作系统中的一种基本操作。...
用户输入原始文件地址。。。然后输入要复制到的目录。
在标题和描述中提到的"Java文件复制源代码",主要是指如何使用Java语言来实现文件的拷贝操作。这里我们将深入探讨如何通过Java标准库API来完成文件的复制,并且特别关注使用Swing组件的情况。 首先,我们从最基础的...
### 一、Java文件复制的基本原理 在Java中,复制文件通常涉及到读取源文件的内容,并将其写入到目标文件的过程。这个过程可以通过多种方式实现,包括使用`FileInputStream`和`FileOutputStream`、`Files.copy()`...
在Java编程语言中,文件复制是一项常见的任务,用于在不同位置之间移动或备份数据。本文将详细介绍如何在Java中实现文件复制,同时考虑到输入输出异常处理,并在DOS控制台环境中运行程序。 首先,我们需要创建一个...
这个名为"File-Operation-by-java.rar"的压缩包包含了一个用Java实现的文件操作示例,它演示了如何进行文件复制、移动、删除以及新建等基本操作。让我们详细探讨一下这些功能的实现。 1. **文件复制**: 文件复制...
实现简单的文件复制功能,适合java入门学习 输入输出部分
在Java编程语言中,文件复制是一项常见的任务,主要通过IO(Input/Output)流来实现。IO流提供了从一个源读取数据并将其写入另一个目的地的机制。在这个主题中,我们将深入探讨如何使用Java的IO流进行文件复制,重点...