try {
final InputStream in = new FileInputStream(inputFileName);
try {
final OutputStream out = new FileOutputStream(outputFileName);
try {
copy(in, out);
out.flush(); // Doesn't actually do anything in this specific case.
} finally {
out.close();
}
} finally {
in.close();
}
} catch (IOException exc) {
throw new SomeRelevantException(exc);
}
Помните, что при открытии потока может возникнуть исключение, поэтому вам нужно try
между открытиями потока (пожалуйста, не делайте хак с участием null
s. Все может выдать Error
(которые не являются экземплярами Exception
).
Оказывается, что catch
и finally
редко должны иметь одни и те же try
.
Начиная с Java SE 7 вы можете написатьиспользуйте try-with-resource, чтобы избежать большого количества отступов. Он более или менее делает то же самое, хотя скрытые исключения скрыты.
try (
final InputStream in = new FileInputStream(inputFileName);
final OutputStream out = new FileOutputStream(outputFileName);
) {
copy(in, out);
out.flush(); // Doesn't actually do anything in this specific case.
} catch (IOException exc) {
throw new SomeRelevantException(exc);
}
Возможно, вы захотите использовать идиому Execute Around .
Я считаю, что стандартным хорошим способом копирования является использование NIO transferTo
/ transferFrom
.