0

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

最適なアプローチは何かという提案はありますか? gc は後で HttpURLConnection オブジェクトをクリアすると思いますが、ハウスキーピングを積極的に行うことをお勧めします。また、プロキシ オブジェクトに渡された「新しい BufferedInputStream」は、基礎となる struts フレームワーク (?) によって閉じられると想定しています。

4

2 に答える 2

1

よりクリーンな方法は、入力ストリームをサブクラス化し、クローズをオーバーライドすることです。そうすれば、ストラットがクローズを呼び出すときに、ストリームを読み取った後、接続を閉じることができます。

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 パラメータとして設定されるストリームです。

于 2013-10-11T16:42:40.593 に答える