一直困扰我的是,在Java中复制文件的唯一方法包括打开流,声明缓冲区,读入一个文件,循环遍历它,并将其写入到另一个steam。网络上充斥着类似的,但仍然略有不同的这类解决方案的实现。
是否有一种更好的方法能够保持在Java语言的范围内(即不涉及执行特定于操作系统的命令)?也许在一些可靠的开源实用程序包中,它至少会模糊这个底层实现,并提供一行解决方案?
一直困扰我的是,在Java中复制文件的唯一方法包括打开流,声明缓冲区,读入一个文件,循环遍历它,并将其写入到另一个steam。网络上充斥着类似的,但仍然略有不同的这类解决方案的实现。
是否有一种更好的方法能够保持在Java语言的范围内(即不涉及执行特定于操作系统的命令)?也许在一些可靠的开源实用程序包中,它至少会模糊这个底层实现,并提供一行解决方案?
当前回答
正如上面提到的工具包,Apache Commons IO是可行的方法,特别是FileUtils.copyFile();它能帮你处理所有的重担。
作为附注,请注意FileUtils的最新版本(例如2.0.1版本)已经添加了用于复制文件的NIO;NIO可以显著提高文件复制性能,这在很大程度上是因为NIO例程直接将复制推迟到OS/文件系统,而不是通过Java层读写字节来处理它。因此,如果您正在寻找性能,可能值得检查您使用的是最新版本的FileUtils。
其他回答
快速和工作与所有版本的Java和Android:
private void copy(final File f1, final File f2) throws IOException {
f2.createNewFile();
final RandomAccessFile file1 = new RandomAccessFile(f1, "r");
final RandomAccessFile file2 = new RandomAccessFile(f2, "rw");
file2.getChannel().write(file1.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, f1.length()));
file1.close();
file2.close();
}
如果你在一个已经使用Spring的web应用程序中,如果你不想包含Apache Commons IO来进行简单的文件复制,你可以使用Spring框架的FileCopyUtils。
正如上面提到的工具包,Apache Commons IO是可行的方法,特别是FileUtils.copyFile();它能帮你处理所有的重担。
作为附注,请注意FileUtils的最新版本(例如2.0.1版本)已经添加了用于复制文件的NIO;NIO可以显著提高文件复制性能,这在很大程度上是因为NIO例程直接将复制推迟到OS/文件系统,而不是通过Java层读写字节来处理它。因此,如果您正在寻找性能,可能值得检查您使用的是最新版本的FileUtils。
在Java 7中很容易…
File src = new File("original.txt");
File target = new File("copy.txt");
Files.copy(src.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);
要复制文件并将其保存到目标路径,您可以使用下面的方法。
public void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);
try {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} finally {
out.close();
}
} finally {
in.close();
}
}