当前位置:  开发笔记 > 编程语言 > 正文

用Java移动/复制文件操作

如何解决《用Java移动/复制文件操作》经验,为你挑选了6个好方法。

是否有标准的Java库来处理常见的文件操作,例如移动/复制文件/文件夹?



1> Rigo Vides..:

以下是如何通过java.nio操作执行此操作:

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();

        // previous code: destination.transferFrom(source, 0, source.size());
        // to avoid infinite loops, should be:
        long count = 0;
        long size = source.size();              
        while((count += destination.transferFrom(source, count, size-count))


值得注意的是,Java 7具有更简单的[复制/移动方法](http://docs.oracle.com/javase/tutorial/essential/io/copy.html).
如果文件存在,内容是否会被追加或覆盖?
@Erik Allik:如果操作失败,`Files.move`将告诉你*为什么*而不是简单地返回`false`.并且`Files.move`可以处理非简单重命名的移动,即需要复制和删除.
为什么File.renameTo不如Files.move好?

2> erickson..:

还没有,但New NIO(JSR 203)将支持这些常见操作.

与此同时,还有一些事情需要牢记.

File.renameTo通常仅适用于同一文件系统卷.我认为这相当于"mv"命令.如果可以的话,请使用它,但是对于一般复制和移动支持,您需要有一个后备.

当重命名不起作用时,您将需要实际复制文件(如果它是"移动"操作,则使用File.delete删除原始文件).要以最高效率执行此操作,请使用FileChannel.transferTo或FileChannel.transferFrom方法.实现是特定于平台的,但通常,当从一个文件复制到另一个文件时,实现避免在内核和用户空间之间来回传输数据,从而大大提高了效率.



3> Pyrolistical..:

退房:http: //commons.apache.org/io/

它有副本,如上所述JDK已经移动.

不要实现自己的复制方法.有那么多漂浮在那里......


复制方法远非微不足道.您可以轻松地制作一个使用Streams不能执行的正确的,使用NIO的快速但不正确的一个.当有高质量的库时,永远不要实现自己的实用程序.
实现一个人自己的复制方法是微不足道的,这意味着你不会依赖整个库.*做*自己实现
复制方法*非常重要,而且Apache Commons无法处理常见的用例:主内存的信息太大.用于管理大容量存储的库应该限制其内存消耗,这是Apache Commons移动方法所缺乏的.

4> ntg..:

以前的答案似乎已经过时了.

Java的File.renameTo()可能是API 7最简单的解决方案,似乎工作正常.小心它不会出现异常,但会返回真/假!!!

请注意,在以前的版本中似乎存在问题(与NIO相同).

如果您需要使用以前的版本,请点击此处.

File f1= new File("C:\\Users\\.....\\foo");
File f2= new File("C:\\Users\\......\\foo.old");
System.err.println("Result of move:"+f1.renameTo(f2));

或者:

System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI());
Path b1=Files.move(f1.toPath(),  f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING ););
System.err.println("Move: RETURNS:"+b1);


如果你得到"进程无法访问该文件,因为它正被另一个进程使用."该进程无法访问该文件,因为它正被另一个进程使用."第二段代码异常,请记得关闭文件在移动它之前.....
还有其他意外情况会失败,例如在linux上如果你在/ mnt/a/mnt/b下安装了两个不同的文件系统,你就不能将文件/ mnt/a/file1重命名为/ mnt/b/file2,因为它实际上是一个移动操作,File.renameTo在这种情况下会失败.

5> Andrew McKin..:

谷歌的Guava图书馆也有以下内容:

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html



6> 小智..:

尝试使用org.apache.commons.io.FileUtils(常规文件操作实用程序).设施以下列方式提供:

(1)FileUtils.moveDirectory(File srcDir,File destDir) =>移动目录.

(2)FileUtils.moveDirectoryToDirectory(File src,File destDir,boolean createDestDir) =>将目录移动到另一个目录.

(3)FileUtils.moveFile(File srcFile,File destFile) =>移动文件.

(4)FileUtils.moveFileToDirectory(File srcFile,File destDir,boolean createDestDir) =>将文件移动到目录.

(5)FileUtils.moveToDirectory(File src,File destDir,boolean createDestDir) =>将文件或目录移动到目标目录.

它简单,容易,快速.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有