2013-07-25 70 views
2

我試圖從文件中讀取第一個8192字節,並通過返回布爾值的方法來運行這些字節。如何使用輸入流標記和復位功能?

該布爾值告訴我該文件是否屬於特定類型。

如果該方法在文件類型爲I的字節上返回true,則希望獲取剩餘的字節並通過其他方法運行它們。如果爲false,則通過其他方法運行剩餘的字節。

我試圖使用標記,但沒有成功。

private final void handleFile(InputStream inputStream) { 

    BufferedInputStream bis = new BufferedInputStream(inputStream); 
    bis.mark(8192); 
    byte[] startingBytes = inputStreamToByteArray(bis); 

    if(startingBytes.length == 0) { return; } 

    byte[] finalBytes; 
    if(isFileType(startingBytes)) { 
     bis.reset(); 
     finalBytes = inputStreamToByteArray(bis); 
     methodForFinalBytes(finalBytes); 
    } else { 
     // Do other stuff; 
    } 
} 

private byte[] inputStreamToByteArray(InputStream inputStream) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[8192]; 

    try { 
     while(inputStream.read(buffer) != -1) { 
      baos.write(buffer); 
     } 
    } catch(IOException ioe) { 
     ioe.printStackTrace(); 
    } 

return baos.toByteArray(); 
} 

問題是在我離開的地方撿起,同時還將字節數組保存爲塊(用於處理大文件)。此外,我只得到8192字節返回,而不是剩餘的。

有什麼建議嗎?

+0

'的InputStream#標記(INT)':_Marks在當前位置這個輸入流。隨後對reset方法的調用將重新定位該流的最後標記位置,以便後續讀取重新讀取相同的字節。你只是回想一下'inputStreamToByteArray',它讀取8192個字節。 –

回答

1

首先,它看起來像inputSTreamToByteArray()正在讀取整個流直到文件結束,而不僅僅是第一個8192字節。您可能首先要分別讀取第一個8192字節。

其次,你是否想重新讀這些字節?如果不是,我不確定是否需要標記/重置。 (特別是因爲你還有字節數組)

下面的代碼首先讀取的前8192個字節,然後決定做什麼:

byte[] header = new byte[8192]; 
//reads entire array or until EOF whichever is first 
bis.read(header); 

if(isFileType(header)) { 
    byte[] finalBytes = inputStreamToByteArray(bis); 
    methodForFinalBytes(finalBytes); 
} else { 
    // Do other stuff; 
} 
+0

如何設置我的其他方法,以便它返回該inputStream的塊? –

+0

我不確定塊是什麼意思,但InputStream有一個方法read(byte []),它可以一次讀取幾個字節,並將它們全部放入給定的數組中。所以你可以用這種方式「大塊」。 – dkatzel

+0

如果你指定了'byte [] finalBytes = inputStreamToByteArray(bis)',如果文件太大,我得到一個內存不足的錯誤。我正試圖弄清楚在處理非常大的文件時如何處理這部分內容 –