2014-11-05 76 views
1

我已经得到了HttpURLConnection类的inputStream:如何获取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呢?

+0

再次做同样的事情 – vefthym 2014-11-05 11:48:27

+0

没有帮助http://stackoverflow.com/questions/5923817/how-to-clone-an-inputstream? – 2014-11-05 11:49:29

+0

@RC。看来Android不支持CloseShieldInputStream – 2014-11-05 11:55:45

回答

3

使用http://commons.apache.org/proper/commons-io/下议院-IO获得数据的byte[]在InputStream的

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

然后由一个OutputStream写它在一个文件中的数据存储,然后做任何你想要的数据。

+0

你的意思是我需要添加一个额外的jar来使用这个IOUtils? – 2014-11-05 11:58:48

+0

是的,commons-io二进制jar,它为你做了所有的缓冲和东西,你的第二个代码段可以被删除并替换为这一行 – EpicPandaForce 2014-11-05 12:04:10

0

现在如何完全重新获得这个inputStream?

你从头再来,从HttpURLConnection conn = (HttpURLConnection) url.openConnection();开始。

或者,你下载它们时用字节做两件事,而不是下载两次。或者,您使用来自HTTP的流下载到文件,然后您在文件中读入解析。

+0

http服务器内容每秒更改一次,如果再次获取,则内容不相同。 – 2014-11-05 11:57:37

+0

@VictorS:然后你的选择就是我的答案中的第二和第三个选项:在下载它们时用字节做两件事(更高效但可能更难编码),或者一旦保存就读取文件(更简单但是增加了更多的磁盘I/O)。 – CommonsWare 2014-11-05 11:59:05