基本上尝试发送视频数据并尝试了解整个过程是如何工作的,不确定我是否正确地将它们放在一起。任何帮助将不胜感激。
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 :(得分:0)
在这种情况下,您在技术上根本不使用输出流,只是多次重新分配。输入参数out
正在方法中重新分配,但之前从未使用过,因为根本不会丢弃传递给此方法的任何现有输出流实例引用,因此它根本不像您想要做的那样。
您再次重新分配out
并丢弃此行上的套接字连接缓冲区:
new BufferedOutputStream(urlConnection.getOutputStream());
这是无害的,因为没有任何资源泄漏(假设disconnect()
被调用),但再一次看起来并不像你想做的那样。
您的代码在最后out
上也有资源泄漏,因为它在try-catch-finally块中没有关闭,这是一个严重的缺陷。此外,需要将用于检查out
上的空值的断言用于提升为if语句,以便在URL解析/打开失败的情况下处理out
为空的非常现实的可能性。可以关闭断言测试,您可以在其中获得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
}
}
}
}
输出流在try块中使用,这样任何异常都会导致finally块根据需要关闭流,从而消除资源泄漏。请注意try块中的示例write()
方法,以最基本的形式说明如何使用OutputStream将数据放入某个目标。
在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
}
}
利用try-with-resources,可以确保资源安全,这要归功于AutoClosable
接口和java 7(及以上)的新语法。有一个小的区别在于,关闭流的异常也会聚集到同一个catch块中,而不是像第一个示例中那样分开。