我的程序需要对文件的整个字节进行计算,并且只要文件超过一定大小就会中断。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我知道我可以使用命令行开关为我的程序分配内存量,但我想知道在我的程序中是否有更有效的方法来处理它?</ p>
我基本上试图想出一种方法来读取块中的文件,并将这些块传递给另一个方法,并基本上在该方法中重建该文件。
这是问题方法。我需要在另一种方法中使用这些字节。
此方法将流转换为字节数组:
private byte[] inputStreamToByteArray(InputStream inputStream) {
BufferedInputStream bis = null;
ByteArrayOutputStream baos = null;
try {
bis = new BufferedInputStream(inputStream);
baos = new ByteArrayOutputStream(bis);
byte[] buffer = new byte[1024];
int nRead;
while((nRead = bis.read(buffer)) != -1) {
baos.write(buffer, 0, nRead);
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
return baos.toByteArray();
}
此方法检查文件类型:
private final boolean isMyFileType(byte[] bytes) {
// do stuff
return theBoolean;
}
它破坏的原因对我来说很有意义 - 如果我有一个巨大的文件并且我正在传递一个巨大的字节数组,那么字节数组最终会变得巨大。
我的目标,我想从文件中读取字节,使用我编写的另一种方法确定它是什么类型的文件,在确定文件类型后对这些字节运行压缩/解压缩方法。
我完成了大部分目标,我只是不知道如何有效地处理文件流和大字节数组。
答案 0 :(得分:1)
您已经在使用BufferedInputStream。使用“标记”方法在蒸汽中放置标记。确保“mark”的“readlimit”参数足够大,以便您检测文件类型。从流中读取前X个字节(但不超过readlimit)并尝试找出内容。然后调用reset()将流设置回到开头,并继续使用你想要对流做的任何事情。