getting outOfMemoryError:在Java中读取文件时使用Java堆空间

getting outOfMemoryError:在Java中读取文件时使用Java堆空间,java,maven,Java,Maven,我已经写了一个程序从文件中获取数据。每当我试图从小文件中查找数据时,我的程序都能正常工作,但当文件较大时就会出错。我试图在eclipse中增加堆大小,但没有任何效果 public static String getHiddenDataFromImage(String imagePath) { String dataContents = null; try { File file = new File(imagePa

我已经写了一个程序从文件中获取数据。每当我试图从小文件中查找数据时,我的程序都能正常工作,但当文件较大时就会出错。我试图在eclipse中增加堆大小,但没有任何效果

 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=新字节[(int)file.length()]

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

  • 不要将整个文件读入内存。在某种程度上,它们是不合适的
  • 不要将
    String
    用作二进制数据的容器

  • 在这里,您只需将
    seek()
    设置为所需的偏移量,读取那么多字节,对它们进行Base64解码,然后返回它们

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

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

    java-Xms512m-xmx1024mjavaapp


    我不熟悉Eclipse,因此不知道如何从IDE中增加堆大小。但是,您可以使用上面提到的“java”程序在命令行上测试您的程序,看看您的程序是否可以处理更大的堆大小。

    您到底是如何尝试“在eclipse中增加堆大小的”?你的文件有多大?我的项目在maven中,所以我添加了pom。我的文件大小是140MB,他不必读整个文件。你永远不必阅读整个文件:我能想到的唯一例外是图像,只有当你要显示它们的时候。