文件复制的过程很简单,从源文件读出数据,再写到目标文件就实现了文件复制,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中处理文件的基本概念: 1. **`java.io.File`**:用于表示文件或目录路径,可以获取文件属性,如文件大小、最后修改时间等。 2. **`java.io.InputStream`** 和 **`java.io....
"Java 文件复制(带有编码类型)" 在 Java 中,文件复制是非常常见的操作。今天,我们将讨论如何使用 Java 将文件从一个位置复制到另一个位置,并且带有编码类型。 标题:Java 文件复制(带有编码类型) 描述:...
下面将详细讲解如何使用Java进行文件复制,以及涉及的相关知识点。 首先,我们需要导入Java的`java.io`包,这个包包含了处理输入/输出流的类,是实现文件复制的关键。主要使用的类有`FileInputStream`(输入流)和`...
java文件复制,使用java语言开发的,效果如windows 的复制和粘贴效果。
在实现文件复制时,我们通常会使用`BufferedInputStream`和`BufferedOutputStream`来提高效率,它们可以一次性读写多个字节,减少磁盘I/O操作的次数。 3. **递归复制文件夹**:当需要复制一个文件夹及其所有子...
本文将详细介绍四种常见的Java文件复制方法:使用`FileStreams`、使用`FileChannel`、使用Apache `Commons IO`以及使用Java 7的`Files`类。 #### 1. 使用`FileStreams`复制文件 这种方法是最传统的文件复制手段,...
### 一、Java文件复制的基本原理 在Java中,复制文件通常涉及到读取源文件的内容,并将其写入到目标文件的过程。这个过程可以通过多种方式实现,包括使用`FileInputStream`和`FileOutputStream`、`Files.copy()`...
Java 文件复制粘贴是指使用 Java 语言实现文件的复制和粘贴操作。在本节中,我们将介绍 Java 文件复制粘贴的实现方法。 文件复制粘贴的重要性 文件复制粘贴是计算机操作系统中的一种基本操作。它可以将文件从一个...
例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio.channels.FileChannel; import java.nio.file.StandardOpenOption; public class CopyFileWithNIO { ...
使用java创建文件并复制到另一个文件中
一个简单的基于java实现的文件复制器,分享给大家学习
在Java编程语言中,文件复制是一项...这样,你就成功地使用Java实现了文件复制功能,并在DOS环境中运行了该程序。注意,为了确保程序正常运行,你需要确保源文件存在,目标文件路径是可写的,且具有适当的文件权限。
本资源主要讲解了高效率文件复制的java实现方法,包含了两种不同的实现方式,分别使用java io流和FileChannel来实现文件复制操作。 知识点1:Java IO流文件复制 在第一个实现方法中,我们使用了Java IO流来实现...
java实现excel表格文件的复制,测试可用,将excel表格的表头和内容拷贝到新表中
这可以通过计划任务或定时器实现,确保在特定时间点执行文件复制操作。 - **版本控制**:为了便于回滚到历史版本,备份系统还应考虑保留多个备份版本,以便在需要时恢复到特定时间点的数据状态。 5. **完整性校验*...
本文将基于提供的代码片段来详细解析如何使用Java进行文件复制,包括文本文件与二进制文件(如图片)的复制方法。 #### 一、文本文件复制 首先来看文本文件的复制过程。文本文件通常是以字符流的形式进行读写的,...
综上所述,Java中的文件复制可以通过多种方式进行,Stream API提供了一种更现代、更高效的解决方案,特别是在Java 8及更高版本中。在实际编程中,开发者应根据项目需求和性能要求灵活选择合适的方法。
在标题和描述中提到的"Java文件复制源代码",主要是指如何使用Java语言来实现文件的拷贝操作。这里我们将深入探讨如何通过Java标准库API来完成文件的复制,并且特别关注使用Swing组件的情况。 首先,我们从最基础的...
本文将详细讨论如何使用Java连接FTP(File Transfer Protocol)服务器,进行文件的上传、下载、删除以及复制等操作。 首先,Java通过`java.net`和`javax.net`包提供了FTP客户端的功能。主要依赖于`java.net....