2015-05-26 2 views
1

В основном пытается отправить видеоданные и попытаться понять, как работает весь этот процесс, не зная, правильно ли я это собрал. Любая помощь будет принята с благодарностью.Запрос на правильное использование OutputStream

public void OutputStream(BufferedOutputStream out) throws MalformedURLException { 
    URL url = new URL("http://www.android.com//"); 
    HttpURLConnection urlConnection = null; 
    try { 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setDoOutput(true); 
     urlConnection.setChunkedStreamingMode(0); 
     out = new BufferedOutputStream(urlConnection.getOutputStream()); 
     out = new BufferedOutputStream(new FileOutputStream(String.valueOf(mVideoUri)), 8 * 1024); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     assert urlConnection != null; 
     urlConnection.disconnect(); 
    } 
} 
+0

Если это правильно, как бы мне позвонить в этот метод? – masteryupa

ответ

0

Вы в техническом отношении не используете выходной поток вообще в этом случае, просто переставляя его несколько раз. Входной параметр 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, а не отдельно, как в первом примере.

Смежные вопросы