查询OutputStream的正确用法

时间:2015-05-26 12:09:57

标签: java android

基本上尝试发送视频数据并尝试了解整个过程是如何工作的,不确定我是否正确地将它们放在一起。任何帮助将不胜感激。

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();
    }
}

1 个答案:

答案 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块中,而不是像第一个示例中那样分开。