如何针对大文件的整个字节运行方法

时间:2013-07-23 17:35:23

标签: java bytearray inputstream out-of-memory

我的程序需要对文件的整个字节进行计算,并且只要文件超过一定大小就会中断。

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;
}

它破坏的原因对我来说很有意义 - 如果我有一个巨大的文件并且我正在传递一个巨大的字节数组,那么字节数组最终会变得巨大。

我的目标,我想从文件中读取字节,使用我编写的另一种方法确定它是什么类型的文件,在确定文件类型后对这些字节运行压缩/解压缩方法。

我完成了大部分目标,我只是不知道如何有效地处理文件流和大字节数组。

1 个答案:

答案 0 :(得分:1)

您已经在使用BufferedInputStream。使用“标记”方法在蒸汽中放置标记。确保“mark”的“readlimit”参数足够大,以便您检测文件类型。从流中读取前X个字节(但不超过readlimit)并尝试找出内容。然后调用reset()将流设置回到开头,并继续使用你想要对流做的任何事情。