FileInputStreamのtransferToメソッドを使用してOSXでアプリファイルを移動しようとしていますが、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:タイトルが「osxに.appファイルを移動する」から「osxに.appファイルをコピーする」に変更されました。元のファイルをそのまま保持する必要があります。
編集2: JoelWestbergによって提案されたApacheCommons FileUtils(具体的にはcopyDirectoryメソッド)を使用してファイルをコピーすることができました。私が今直面している問題は、コピーしたアプリバンドルを実行しようとすると、アプリがドック内で永続的にバウンスし、実行されないことです。これがなぜであるかについてのアイデアはありますか?
編集3:私は永続的に跳ねる問題を修正する方法を理解しました。アプリバンドルをコピーしたところ、2つのUNIXスクリプトが必要な実行可能ファイルに設定されていなかったことがわかりました。これを修正するには、FileクラスのsetExecutableメソッドを使用しただけです。