java輸入資料流讀取完之後重新讀取的問題
來源:互聯網
上載者:User
在檔案流讀取完之後會定位到末端,則無法再用該輸入資料流讀取資料。若用read()方法則返回-1,若你調用available()方法返回0,若要重新讀取,則要用到mark和reset方法。若要重新從0開頭開始讀取,則要在讀取輸入資料流之前用mark方法,參數readlimit由自己定義。若在讀取了第n個位元組後調用mark方法,在輸入資料流讀取完之後,調用reset則從新重第n個位元組開始讀取。 public void mark(int readlimit) 在此輸入資料流中標記當前的位置。對 reset 方法的後續調用會在最後標記的位置重新置放此流,以便後續讀取重新讀取相同的位元組。 readlimit 參數告知此輸入資料流在標記位置失效之前允許讀取的位元組數。 mark 的常規協定是:如果方法 markSupported 返回 true,那麼輸入資料流總是在調用 mark 之後記錄所有讀取的位元組,並時刻準備在調用方法 reset 時(無論何時),再次提供這些相同的位元組。但是,如果在調用 reset 之前可以從流中讀取多於 readlimit 的位元組,則不需要該流記錄任何資料。如果在mark之後讀取的資料的大小大於 readlimit和BufferedInputStream類的緩衝區大小兩者中的最大值則mark標記無效。 標記已關閉的流對其無效。 InputStream 的 mark 方法不執行任何操作。 參數: readlimit - 在標記位置失效前可以讀取位元組的最大限制。 注意:mark和reset方法只能在BufferedInputStream中使用,BufferedInputStream類調用mark(int readlimit)方法後讀取多少位元組標記才失效,是取readlimit和BufferedInputStream類的緩衝區大小兩者中的最大值,而並非完全由readlimit確定。這個在JAVA文檔中是沒有提到的。 例子: public PreviewImage(InputStream reader2,OutputStream os)throws IOException{ BufferedInputStream reader = new BufferedInputStream(reader2); byte[] b = new byte[1024 * 5]; //輸出資料流的緩衝區 5kb int len; reader.mark(reader.available()+1); while ( (len = reader.read(b)) != -1) { //os.write(b, 0, len); } reader.reset(); while ( (len = reader.read(b)) != -1) { os.write(b, 0, len); } os.flush(); os.close(); }