我正在尝试使用FileInputStream的transferTo方法在OS X中移动应用程序文件,但不断获取FileNotFoundException(没有这样的文件或目录)。我知道情况并非如此,因为当我在app文件上运行时,.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(特别是copyDirectory方法)的建议,通过Apache Commons FileUtils复制文件。我现在面临的问题是当我去运行复制的应用程序包时,应用程序会永久地在Dock中弹跳并且永远不会运行。关于这是为什么的任何想法?
编辑3:我已经找到了解决永久性弹跳问题的方法。事实证明,当我复制应用程序包时,它没有将2个unix脚本设置为需要的可执行文件。我只是使用File类中的setExecutable方法来解决这个问题。
答案 0 :(得分:4)
简单的答案是OSX术语中没有.app
文件。您看到的.app是一个文件夹。尝试将其作为文件读取时,您将获得FileNotFound,因为它不是文件。
如果您使用的是Java 7,则无论是文件还是文件夹,都可以使用新的Files.move()方法执行所需的操作。
编辑:正如评论中建议的 MadProgrammer 一样,简单地使用已经存在更长时间的File.renameTo()会更容易。