Вы в техническом отношении не используете выходной поток вообще в этом случае, просто переставляя его несколько раз. Входной параметр out
переназначается в этом методе, но никогда не использовался до того, как это не похоже на то, что вы хотите делать вообще, поскольку всякий существующий экземпляр экземпляра выходного потока, переданный этому методу, просто отбрасывается.
Вы переназначить out
еще раз и отбросить буферном соединения сокета на этой линии:
new BufferedOutputStream(urlConnection.getOutputStream());
, который в основном безвреден в том, что не любая утечка ресурсов (при условии, что disconnect()
называется), но когда-то снова не похоже на то, что вы хотите сделать.
Ваш код также имеет утечку ресурсов на последнем out
, учитывая, что он не закрыт в любом месте блока try-catch-finally, который является серьезным недостатком. Кроме того, использование утверждений для проверки нулей на out
необходимо повысить до if-оператора, чтобы справиться с реальной возможностью, что out
имеет значение null в случае неудачного разрешения/открытия URL-адреса. Тесты утверждений можно отключить, в результате чего вы получите NPE (и когда вы включите его, вы получите AssertionError
, нижняя из которых лучше).
Хотя это трудно предвидеть, что именно ваша структура проекта, общий договор использования выходного потока можно рассматривать следующим образом:
public void foo(){
OutputStream out = null;
byte[] data = ... // Populated from some data source
try{
out = ... // Populated from some source
out.write(data); // Writes the data to the output destination
}catch(IOException ex){
// Handle exception here
}finally{
// Only attempt to close the output stream if it was actually opened successfully
if(out != null){
try{
out.close();
}catch(IOException closeEx){
// Handle, propogate upwards or log it
}
}
}
}
Выходной поток используется в блоке Ьгу, что любые исключения будут приводят к тому, что блок finally окончательно завершает поток, устраняя утечку ресурсов. Обратите внимание на пример метода write()
в блоке try, иллюстрирующий в самой базовой форме, как OutputStreams можно использовать для посылки данных в какой-либо пункт назначения.
Под Java 7 (и выше), приведенный выше пример является более компактным:
public void foo(){
byte[] data = ... // Populated from some data source
try(OutputStream out = ...){
out.write(data); // Writes the data to the output destination
}catch(IOException ex){
// Handle exception here
}
}
Использование примерочных с-ресурсами, безопасность ресурсов могут быть уверены, благодаря интерфейсу и Java 7 AutoClosable
(и выше это) новый синтаксис. Существует одна небольшая разница в том, что исключения из закрытия потока также сгруппированы в один и тот же блок catch, а не отдельно, как в первом примере.
Если это правильно, как бы мне позвонить в этот метод? – masteryupa