【问题标题】:How to get copy of InputStream? [duplicate]如何获取 InputStream 的副本? [复制]
【发布时间】:2015-01-01 14:26:30
【问题描述】:

我已经得到了 HttpURLConnection inputStream:

    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(10000 /* milliseconds */);
    conn.setConnectTimeout(15000 /* milliseconds */);
    conn.setRequestMethod("GET");
    conn.setDoInput(true);
    // Starts the query
    conn.connect();
    InputStream stream = conn.getInputStream();

现在我要生成这个inputStream的两个副本,一个用于存储到文件,另一个用于解析,但是我存储后,inputStream无法解析:

        BufferedInputStream bis = new BufferedInputStream(inStream);
        try {
            byte[] buffer = new byte[1024];

            if (inStream.markSupported()) {
                inStream.mark(1);                   
            }
            int bytesRead = 0;
            while ((bytesRead = bis.read(buffer)) != -1) {
                Log.d(TAG, "buffer: "+new String(buffer));
                outStream.write(buffer, 0, bytesRead);
            }
            outStream.flush();
            inStream.reset();
            outStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

现在如何再次完全获取这个 inputStream?

【问题讨论】:

标签: java android


【解决方案1】:

使用http://commons.apache.org/proper/commons-io/ Commons-IO 获取 InputStream 中数据的byte[]

byte[] data = IOUtils.toByteArray(httpsURLConnection.getInputStream());

然后通过将数据写入 OutputStream 将数据存储在文件中,然后随心所欲地处理数据。

【讨论】:

  • 你的意思是我需要添加一个额外的 jar 来使用这个 IOUtils?
  • 是的,commons-io 二进制 jar,它为您完成所有缓冲和工作,您的第二个代码部分可以删除并替换为这一行
【解决方案2】:

现在如何再次完全获取这个 inputStream?

你从HttpURLConnection conn = (HttpURLConnection) url.openConnection();开始重新做所有事情。

或者,您在下载字节时使用字节做两件事,而不是下载两次。

或者,您使用来自 HTTP 的流下载到文件,然后读入文件进行解析。

【讨论】:

  • http服务器的内容每秒都在变化,如果再get一次就不是同一个内容了。
  • @VictorS:那么您的选择是我的答案中的第二个和第三个选项:在下载字节时对它们做两件事(更有效但可能更难编码),或者读入文件保存后(更容易,但会增加更多磁盘 I/O)。
猜你喜欢
  • 2016-05-31
  • 2011-05-03
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2019-10-18
  • 2021-04-08
  • 2018-08-25
  • 2010-11-22
相关资源
最近更新 更多