我正在尝试从文件中读取第一个8192
字节,并通过返回布尔值的方法运行这些字节。
该布尔值告诉我文件是否为特定类型。
如果该方法针对文件类型的字节返回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
字节,而不是剩余的字节。有什么建议么?
最佳答案
首先,看起来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;
}