public class FileCopyTest {
public static void main(String[] args) {
Path sp = Paths.get("food.jpg");
Path dp = Paths.get("food_copy.jpg");
try {
if(Files.exists(dp)) {
System.out.println("file already exists");
} else {
Files.copy(sp, dp, StandardCopyOption.REPLACE_EXISTING);
System.out.println("copy sucucess");
};
} catch(IOException e) {
System.out.println("IOException");
}
}
}
food_copy.jpgは存在しない。
このコードを2回実行した時に表示される出力結果はどれでしょうか。
A
copy sucucess
copy sucucess
B
copy sucucess
file already exists
C
copy sucucess
IOException
D
IOException
IOException
E
try-with-resourceなどでFileをcloseしていないためコンパイルエラー
F
try-with-resourceなどでFileをcloseしていないため実行時エラー
解答
B1回目
if(Files.exists(dp))
では「food_copy.jpg」が存在するか確認します。
food_copy.jpgは存在しない。とあるので、false
になります。
Files.copy(sp, dp, StandardCopyOption.REPLACE_EXISTING);
ではnioのFilesを使ってjpgファイルをコピーしています。
オプションのStandardCopyOption.REPLACE_EXISTING
はコピーが存在しても上書きします。
コピーが作成された後、「copy sucucess」が出力されます。
2回目
if(Files.exists(dp))
では「food_copy.jpg」が存在するか確認します。
1回目の実行でコピーファイルが既に存在するので、true
になります。
「file already exists」が出力されます。
補足
try-with-resources
try-with-resourcesは、AutoCloseable
インターフェースを実装するリソース
(例: InputStream
, OutputStream
, BufferedReader
, BufferedWriter
など)を使用する場合に便利です。
リソースが自動的にクローズされるため、リソースリークを防ぐのに役立ちます。
Files.copy()
メソッドは、ファイルシステムの操作を行うだけでリソースを管理するわけではないためtry
ブロック内で例外処理を行うだけで問題ありません。
仮に本コードのif文がなく以下の場合
try {
Files.copy(sp, dp, StandardCopyOption.REPLACE_EXISTING);
System.out.println("copy sucucess");
} catch(IOException e) {
System.out.println("IOException");
}
コピーは上書きされるため、1回目、2回目ともに「copy sucucess」が出力されます。
Files.copy(sp, dp);
ちなみにStandardCopyOption.REPLACE_EXISTING
オプションを指定せずに実行すると
1回目はコピーが成功します。
2回目はFileAlreadyExistsException
がスローされます。
「IOException」が出力されます。