В вашем случае, вероятно, единственные ресурсы, которые требуют для закрытия, это InputStream
и FileOutputStream
.Однако почему бы просто не закрыть их все с помощью try-with-resources?Не больно звонить Closeable#close()
на всякий случай 1 .Фактически, вы, вероятно, должны закрывать каждый Closeable
в вашем элементе управления (то есть, который вы открывали), когда закончите с ними (вы не обязательно знаете, нужно ли обертке также высвобождать ресурсы).
try (InputStream inputStream = new URL(url).openStream();
ReadableByteChannel readableByteChannel = Channels.newChannel(inputStream);
FileOutputStream fileOutputStream = new FileOutputStream(Bukkit.getServer().getUpdateFolderFile());
FileChannel fileChannel = fileOutputStream.getChannel()) {
fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
} catch (IOException ex) {
ex.printStackTrace();
}
Вышесказанное мало чем отличается от того, что у вас сейчас есть.
1.Вызов метода Closeable#close()
не имеет эффекта, если вызывается ранее.Это не обязательно верно для AutoCloseable
реализаций (которые не реализуют Closeable
).
Кроме того, если вы используете Java 9+, вам не нужноиметь дело с каналами NIO.Класс InputStream
имеет метод, добавленный в Java 9: transferTo(OutputStream)
.
try (InputStream is = new URL(url).openStream();
FileOutputStream fos = new FileOutputStream(...)) {
is.transferTo(fos);
} catch (IOException ex) {
ex.printStackTrace();
}
Вы также можете использовать Files.copy(InputStream,Path,CopyOption...)
(Java7 +).
try (InputStream is = new URL(url).openStream()) {
Path file = Bukkit.getServer().getUpdateFolderFile().toPath();
Files.copy(is, file, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ex) {
ex.printStackTrace();
}
Обратите внимание, что это не может привести к тому же поведению, что и при использовании FileOutputStream
.Я не совсем уверен, урезает ли FileOutputStream#<init>(File)
какие-либо существующие байты или просто перезаписывает байты с самого начала.
Если вы предпочитаете использовать каналы NIO, вы можете открыть FileChannel
напрямую через FileChannel.open(Path,OpenOption...)
вместо прохождения FileOutputStream
.Как я показал в примере выше, вы можете конвертировать File
в Path
, используя File#toPath()
.