它已总是缠着我要复制的文件的唯一方法是打开流,声明一个循环遍历它,和其他蒸汽,写出的文件中读取的缓冲区。web 充斥类似,但仍然略有不同的实现,这种类型的解决方案。
有没有更好的方法,在 Java 语言中的范围内保持 (意义并不涉及执行 ing 操作系统特定的命令) 吗?也许一些可靠的开放源代码实用程序程序包中,将至少掩盖这底层的实现和提供一条线的解决方案吗?
Google 的番石榴图书馆也有此:
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html
可用作标准的 Java 7、 path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/tutorial/essential/io/copy.html
我不敢相信他们花了这么长时间划一的东西,简单文件复制:(共同
请注意所有这些机制只复制不该元数据如权限的文件的内容。因此,如果您要复制或移动 linux 上的一个可执行文件.sh 文件新的文件不会执行。
为了真正一个复制或移动文件即获得相同的结果,从一行命令复制实际上要使用本机的工具。一个 shell 脚本或 JNI 中。
显然,这可能固定在 java 7-http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html。手指交叉 !
我会避免使用一个巨型的 apache 公像 api。这是一个简单的操作,其内置到新 NIO 包在 JDK。它种已链接到一个先前的答复中,但 NIO api 中的主要方法是新功能"transferTo"和"transferFrom"。
链接的文章之一显示如何将此功能集成到您的代码使用了 transferFrom 的一个好方法:
public static void copyFile(File sourceFile, File destFile) throws IOException {
if(!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
}
finally {
if(source != null) {
source.close();
}
if(destination != null) {
destination.close();
}
}
学习 NIO 可以有点棘手,因此可能要公正信任此机械前去和努力学习 NIO 一夜之间。从个人的经验,它可以是一件很难的事情了解如果您没有经验,并通过 java.io 流了 IO。
正如上文提到的工具包,Apache 共 IO 是去专门 FileUtils.copyFile() ;它为您处理所有繁重的任务。
作为一个后脚本请注意该 版本的 FileUtils 颠覆存储库中当前 已添加 NIO 用于复制的文件 ; 及NIO 可以大大提高文件复制性能,很大一部分因为 NIO 例程推迟将复制到文件系统操作系统直接而不是通过读取和写入字节为单位) 通过 Java 图层来处理它。所以如果您要查找的性能,它可能值得 检查共 IO 的 SVN 回购协议,而不是使用当前的 1.4 版本。