在java中读取文件时获取outOfMemoryError:Java堆空间

时间:2015-03-24 06:43:20

标签: java maven

我编写了一个程序来从文件中获取数据。每当我尝试从小文件中查找数据时,我的程序都能正常工作,但是当文件很大时会发生错误。我试图在eclipse中增加堆大小但没有waorks.Below是我的代码。

 public static String getHiddenDataFromImage(String imagePath)
      {
        String dataContents = null;
        try
        {
          File file = new File(imagePath);
          byte[] fileData = new byte[(int)file.length()];
          InputStream inStream = new FileInputStream(file);
          inStream.read(fileData);
          inStream.close();
          String tempFileData = new String(fileData);
          String finalData = tempFileData.substring(tempFileData.indexOf(extraStr) + extraStr.length(), tempFileData.length());
          byte[] bytefinalData=finalData.getBytes();
          byte[] temp = (byte[]) new Base64().decode(bytefinalData);
          dataContents = new String(temp);
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }

        return dataContents;
      }


     public static void main(String[] args){
    System.out.println(ImageAnalyzerUtil.getHiddenDataFromImage2("C:/example.m4b"));
  }

输出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at ImageAnalyzerUtil.getHiddenDataFromImage(ImageAnalyzerUtil.java:199)
    at ImageAnalyzerUtil.main(ImageAnalyzerUtil.java:332)

第199行是byte [] fileData = new byte [(int)file.length()];

3 个答案:

答案 0 :(得分:2)

  1. 不要将整个文件读入内存。在某些时候他们不适合。
  2. 不要将String用作二进制数据的容器。
  3. 您需要做的就是seek()到所需的偏移量,读取多个字节,Base64解码它们并返回它们。

答案 1 :(得分:1)

您的程序似乎正在对文件进行base 64解码。它不需要立即读取内存中的整个文件:有些库可以将输入流解码为输出流。

答案 2 :(得分:-1)

正如@Maurice和@EJP所建议的那样,避免在程序中一次读取整个文件。但是,如果您必须读取整个文件,则可以为java指定运行时参数,以便为您提供更大的堆大小,如下所示。

-Xms - 设置初始Java堆大小 -Xmx - 设置最大Java堆大小

java -Xms512m -Xmx1024m JavaApp

我不熟悉Eclipse,所以我不知道如何从IDE中增加堆大小。但您可以使用' java'在命令行上测试您的程序。如上所述的程序,以查看您的程序是否使用更大的堆大小。