2014-11-05 75 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