Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java inputStream作为对象属性,关闭HttpURLConnection_Java_Struts2_Struts_Inputstream_Httpurlconnection - Fatal编程技术网

Java inputStream作为对象属性,关闭HttpURLConnection

Java inputStream作为对象属性,关闭HttpURLConnection,java,struts2,struts,inputstream,httpurlconnection,Java,Struts2,Struts,Inputstream,Httpurlconnection,我有一个来自HttpURLConnection的inputStream。inputStream作为属性传递给一个对象,该对象稍后将通过Struts2框架中的getter调用,以直接向用户浏览器提供流。虽然代码似乎按预期工作,但我担心无法正确关闭HttpURLConnection,因为这将在从用户浏览器读取输入流之前使输入流无效。代码如下: private void DownloadOutput(DownloadableObject retVal, URL u, String cookie) {

我有一个来自HttpURLConnection的inputStream。inputStream作为属性传递给一个对象,该对象稍后将通过Struts2框架中的getter调用,以直接向用户浏览器提供流。虽然代码似乎按预期工作,但我担心无法正确关闭HttpURLConnection,因为这将在从用户浏览器读取输入流之前使输入流无效。代码如下:

private void DownloadOutput(DownloadableObject retVal, URL u, String cookie) {
        try {
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Cookie", cookie);

            Map<String, List<String>> headers =  conn.getHeaderFields();

            retVal.setContentLength(conn.getContentLength());
            retVal.setStream(new BufferedInputStream(conn.getInputStream()));
//          in.close();
//            conn.disconnect();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
private void DownloadOutput(可下载对象retVal、URL u、字符串cookie){
试一试{
HttpURLConnection conn=(HttpURLConnection)u.openConnection();
conn.setRequestMethod(“GET”);
conn.setRequestProperty(“Cookie”,Cookie);
Map headers=conn.getHeaderFields();
setContentLength(conn.getContentLength());
setStream(新的BufferedInputStream(conn.getInputStream());
//in.close();
//连接断开();
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}

有没有关于最佳方法的建议?我假设gc稍后会清除HttpURLConnection对象,但是主动地进行一些内务管理是很好的。我还假设传递到代理对象的“new BufferedInputStream”将被底层struts框架关闭(?)

将其转换为字符串,然后将其设置为对象

Streams基本上表示句柄输入/输出源,当您关闭引用时,它将丢失句柄


看起来更干净的方法是将inputstream子类化并覆盖close。这样,当struts调用close时,在读取流之后,您可以关闭连接:

private class mytest extends  BufferedInputStream {

        private HttpURLConnection aConn;

        public mytest(HttpURLConnection conn, InputStream in) {
            super(in);
            this.aConn = conn;
        }

        public mytest(HttpURLConnection conn, InputStream in, int size) {
            super(in, size);
            this.aConn = conn;
        }

        @Override
        public void close() throws IOException {
            super.close();
            System.out.println("The stream has been closed, time to close the connection");
            aConn.disconnect();
            System.out.println("Connection has been disconnected");
        }
    }

因此,上面的对象是将在操作中设置为inputStream参数的流

无法执行此操作,因为流可能表示几百页的pdf。如果这是在web应用程序上,那么如果少数用户请求错误的pdf,就不会消耗这么多内存。@janagn在这种情况下,您需要从中创建一个本地文件,然后将对该本地文件流的引用保存在对象中。HTTPConnectionURL将在调用close()方法后立即关闭流。除非,如果这是确定的,则不关闭它,如代码所示。这是一种“最佳实践”吗?@janagn不,您应该始终关闭HttpURLConnection,因为否则您只是为了没有真正的好处而阻塞/保持端口繁忙。无论如何,我的问题会变得更复杂。本质上,我需要在从struts框架读取流之后通知我的对象关闭连接。