2011-06-08 53 views
1

爲了向Android應用程序添加某種緩存,我試圖將InputStream(我從myUrl.openConnection().getInputStream()獲得)寫入文件。寫入文件時發生IOException(流關閉)

這是我寫的方法:

public static void saveInputStream(InputStream inputStream) throws IOException, Exception { 
     FileOutputStream out = null; 
     OutputStream os = null; 

     try { 
      String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
      String fileName = "feedData.txt"; 
      File myFile = new File(baseDir + File.separator + fileName); 

      out = new FileOutputStream(myFile, false); 
      os = new BufferedOutputStream(out); 

      byte[] buffer = new byte[65536]; 
      int byteRead = 0; 

      while ((byteRead = inputStream.read(buffer)) != -1) { 
       Log.d("CacheManager", "Reading......."); 
       os.write(buffer, 0, byteRead); 
      } 
     } catch(IOException e) { 
      e.printStackTrace(); 
      throw new IOException(); 
     } catch(Exception e) { 
      throw new Exception(); 
     } finally { 
      if (out != null) { 
       try { 
        out.close(); 
       } catch (IOException e) { 
        throw new IOException(); 
       } 
      } 
     } 
    } 

主叫部分看起來像:

URL feedUrl = new URL("rss_feed_url"); 
InputStream inputStream = feedUrl.openConnection().getInputSream(); 
CacheManager.saveInputSteam(inputStream); 

我收到以下情況除外:

(23704): Pas de Notification 
W/System.err(24015): java.io.IOException: Stream is closed 

這是什麼,那是封閉的?

任何想法?

謝謝!

回答

3

看起來服務器已將數據作爲壓縮流發送。在打開流的行和緩存管理器之間沒有任何代碼?

我想你還有一些其他代碼行正在讀取這個流,這就是爲什麼當你到達緩存管理器時它關閉了。

+0

的確,你猜對了!謝謝,問題解決了! – 2011-06-08 13:41:02

-1

首先,我會使用BufferedReader來讀取流。這樣,你可以使用while((input = reader.read())!= null)循環。

但是,您的問題可能與您通過的InputStream有關。你提供的這段代碼是最不喜歡你的例外的!那麼你在哪裏以及如何創建這個InputStream?

+2

「Reader」與「InputStream」不同的用例不同:它只有**在閱讀文本數據(實際上關心文本數據)時纔有意義。這裏情況不同。 – 2011-06-08 13:20:41

+0

什麼?那不是真的!你可以做新的BufferedReader(新的InputStream(bla))! BufferedReader可以讀取所有內容,並且比使用read(buffer)讀取流的速度更快,更快。 – 2011-06-08 13:23:08

+0

不,@Vincent,你錯了:['BufferedReader']的唯一構造函數(http://download.oracle.com /javase/6/docs/api/java/io/BufferedReader.html)帶有其他'Reader'實例,所以你不能傳入'InputStream'。也許你正在考慮一個'BufferedInputStream'? – 2011-06-08 13:25:46

相關問題