java-在OS X中复制.app文件

提问

我正在尝试使用FileInputStream的transferTo方法在OS X中移动应用程序文件,但始终获取FileNotFoundException(没有此类文件或目录).我知道不是这种情况,因为在应用程序文件上运行.exists()方法时,它会返回true.我认为这与文件权限有关,但经过几次测试似乎并非如此.这是我用来移动文件的代码:

public static void moveFile(File sourceFile, File destFile) throws IOException {
    FileChannel source = null;
    FileChannel destination = null;

    try {
        source = new FileInputStream(sourceFile).getChannel();
        destination = new FileOutputStream(destFile).getChannel();

        long count = 0;
        long size = source.size();
        source.transferTo(count, size, destination);
    }
    finally {
        if(source!=null) {
            source.close();
        }

        if(destination!=null) {
            destination.close();
        }
    }
}

编辑1:标题已从“在os x中移动.app文件”更改为“在os x中复制.app文件”.我需要保持原始文件不变.

编辑2:如乔尔·韦斯特伯格(Joel Westberg)所建议的,我能够通过Apache Commons FileUtils复制文件(特别是copyDirectory方法).我现在面临的问题是,当我运行复制的应用程序捆绑包时,该应用程序会在扩展坞中永久反弹,并且永远无法运行.对这是为什么有任何想法吗?

编辑3:我想出了如何解决永久性弹跳的问题.事实证明,当我复制应用程序捆绑包时,它没有将2个Unix脚本设置为所需的可执行文件.我只是使用File类中的setExecutable方法来解决此问题.

最佳答案

简单的答案是,OSX术语中没有.app文件之类的东西.您看到的.app是一个文件夹.尝试将其作为文件读取时,将得到FileNotFound,因为它不是文件.

如果您使用的是Java 7,则可以使用新的Files.move()方法执行所需的操作,而不管它是文件还是文件夹.

编辑:正如MadProgrammer在评论中建议的那样,简单地使用已经更长的File.renameTo()甚至会更容易.