提问
我正在尝试使用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()甚至会更容易.