做课后作业的时候有道操作题做文件的复制粘贴,io流的复制粘贴贼拉麻烦,好巧不巧的我比较懒,就百度找个简单的复制粘贴方法,功夫不负有心人,找到了四种,可把我牛逼坏了。这必须写个博客偷偷记下来,以备后用。
先把老师的链接粘贴上。
4种java复制文件的方式_java_脚本之家 (jb51.net)
尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法。复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。
1. 使用FileStreams复制
这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:
1234567891011121314151617private
static
void
copyFileUsingFileStreams(File source, File dest)
throws
IOException {
InputStream input =
null
;
OutputStream output =
null
;
try
{
input =
new
FileInputStream(source);
output =
new
FileOutputStream(dest);
byte
[] buf =
new
byte
[
1024
];
int
bytesRead;
while
((bytesRead = input.read(buf)) >
0
) {
output.write(buf,
0
, bytesRead);
}
}
finally
{
input.close();
output.close();
}
}
正如你所看到的我们执行几个读和写操作try的数据,所以这应该是一个低效率的,下一个方法我们将看到新的方式。
2. 使用FileChannel复制
Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。这是第二种方法的代码:
123456789101112private
static
void
copyFileUsingFileChannels(File source, File dest)
throws
IOException {
FileChannel inputChannel =
null
;
FileChannel outputChannel =
null
;
try
{
inputChannel =
new
FileInputStream(source).getChannel();
outputChannel =
new
FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel,
0
, inputChannel.size());
}
finally
{
inputChannel.close();
outputChannel.close();
}
}
3. 使用Commons IO复制
Apache Commons IO提供拷贝文件方法在其FileUtils类,可用于复制一个文件到另一个地方。它非常方便使用Apache Commons FileUtils类时,您已经使用您的项目。基本上,这个类使用Java NIO FileChannel内部。 这是第三种方法的代码:
1234private
static
void
copyFileUsingApacheCommonsIO(File source, File dest)
throws
IOException {
FileUtils.copyFile(source, dest);
}
4. 使用Java7的Files类复制
如果你有一些经验在Java 7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:
1234private
static
void
copyFileUsingJava7Files(File source, File dest)
throws
IOException {
Files.copy(source.toPath(), dest.toPath());
}
5. 测试
现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。 从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。 让我们看一下代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.nio.channels.FileChannel;
import
java.nio.file.Files;
import
org.apache.commons.io.FileUtils;
public
class
CopyFilesExample {
public
static
void
main(String[] args)
throws
InterruptedException,
IOException {
File source =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt"
);
File dest =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt"
);
// copy file using FileStreams
long
start = System.nanoTime();
long
end;
copyFileUsingFileStreams(source, dest);
System.out.println(
"Time taken by FileStreams Copy = "
+ (System.nanoTime() - start));
// copy files using java.nio.FileChannel
source =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt"
);
dest =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt"
);
start = System.nanoTime();
copyFileUsingFileChannels(source, dest);
end = System.nanoTime();
System.out.println(
"Time taken by FileChannels Copy = "
+ (end - start));
// copy file using Java 7 Files class
source =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt"
);
dest =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt"
);
start = System.nanoTime();
copyFileUsingJava7Files(source, dest);
end = System.nanoTime();
System.out.println(
"Time taken by Java7 Files Copy = "
+ (end - start));
// copy files using apache commons io
source =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt"
);
dest =
new
File(
"C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt"
);
start = System.nanoTime();
copyFileUsingApacheCommonsIO(source, dest);
end = System.nanoTime();
System.out.println(
"Time taken by Apache Commons IO Copy = "
+ (end - start));
}
private
static
void
copyFileUsingFileStreams(File source, File dest)
throws
IOException {
InputStream input =
null
;
OutputStream output =
null
;
try
{
input =
new
FileInputStream(source);
output =
new
FileOutputStream(dest);
byte
[] buf =
new
byte
[
1024
];
int
bytesRead;
while
((bytesRead = input.read(buf)) >
0
) {
output.write(buf,
0
, bytesRead);
}
}
finally
{
input.close();
output.close();
}
}
private
static
void
copyFileUsingFileChannels(File source, File dest)
throws
IOException {
FileChannel inputChannel =
null
;
FileChannel outputChannel =
null
;
try
{
inputChannel =
new
FileInputStream(source).getChannel();
outputChannel =
new
FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel,
0
, inputChannel.size());
}
finally
{
inputChannel.close();
outputChannel.close();
}
}
private
static
void
copyFileUsingJava7Files(File source, File dest)
throws
IOException {
Files.copy(source.toPath(), dest.toPath());
}
private
static
void
copyFileUsingApacheCommonsIO(File source, File dest)
throws
IOException {
FileUtils.copyFile(source, dest);
}
}
输出:
1234Time taken by FileStreams Copy =
127572360
Time taken by FileChannels Copy =
10449963
Time taken by Java7 Files Copy =
10808333
Time taken by Apache Commons IO Copy =
17971677
正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。
以上就是本文的全部内容,希望对大家的学习有所帮助。
一共四种方法,对于我这种初学者来说,还是比较好理解的,作为课后拓展知识储备。后进末学再次鸣谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~