2013-07-25 43 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)',如果文件太大,我得到一个内存不足的错误。我正试图弄清楚在处理非常大的文件时如何处理这部分内容 –