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

Java 如何对大文件的整个字节运行方法,java,bytearray,inputstream,out-of-memory,Java,Bytearray,Inputstream,Out Of Memory,我的程序需要对文件的整个字节进行计算,当文件超过一定大小时,它就会中断 线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间 我知道我可以使用命令行开关为我的程序分配内存量,但我想知道在我的程序中是否有更有效的方法来处理这个问题 我基本上是想找出一种方法,以块的形式读取文件,并将这些块传递给另一个方法,然后用该方法重建文件 这就是问题的解决方法。我需要在另一个方法中使用这些字节 此方法将流转换为字节数组: private byte[] inputStre

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

线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间

我知道我可以使用命令行开关为我的程序分配内存量,但我想知道在我的程序中是否有更有效的方法来处理这个问题

我基本上是想找出一种方法,以块的形式读取文件,并将这些块传递给另一个方法,然后用该方法重建文件

这就是问题的解决方法。我需要在另一个方法中使用这些字节

此方法将流转换为字节数组:

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;
}
它被破坏的原因对我来说是有意义的——如果我有一个巨大的文件,并且我正在传递一个巨大的字节数组,那么字节数组最终将是巨大的

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


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

您已经在使用BufferedInputStream。使用“标记”方法在蒸汽中做标记。确保“mark”的“readlimit”参数足够大,可以检测文件类型。从流中读取前X字节(但不超过readlimit),并尝试找出内容。然后调用reset()将流设置回起始位置,并继续执行您想对流执行的任何操作。

您需要将该方法更改为一次只处理一个块。@SLaks我该怎么做?基本上,如果您需要内存中的整个字节数组(不确定是否确实需要,这取决于您对该字节数组的处理方式),我认为除了增加JVM的可用内存之外,没有其他事情可做。@mael我正在压缩和解压缩文件。。。我想我需要把整个文件都存储在内存中,但我是个傻瓜,不知道该怎么做。压缩和解压缩我帮不了你,我对这个问题一无所知。但我不确定压缩工具是否通常会将整个文件加载到内存中。