用Java读取BIG文件

时间:2015-12-29 07:51:26

标签: java jenkins

我正在尝试使用以下程序读取2GB文件。问题是我想读取一个文件,然后将其附加到一个字符串中,该字符串传递给程序进行进一步处理。这个应用程序将部署到Jenkins,我无法增加内存大小。想知道,如果我可以将文件处理成小饼,然后处理它

当我将该行追加到String builder中时,我得到了memoryOutOFBound异常。

StringBuilder build = new StringBuilder();
          try {
           FileInputStream fstream = new FileInputStream("E:"+File.separator+"file"+File.separator+"File.text");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

            String strLine;

            //Read File Line By Line
            while ((strLine = br.readLine()) != null)   {
              // Print the content on the console
                build.append(strLine);
            }

            //Close the input stream
            br.close();
          } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

知道如何将Big File解析为字符串吗?或者我应该将文件读入较小的块然后处理它?

2 个答案:

答案 0 :(得分:0)

您是否尝试过增加JVM的内存。您可以通过提供VM参数来执行此操作:-Xms1024m -Xmx2048m

-Xms参数设置JVM的初始和最小堆内存大小。 -Xmx参数定义堆可以为JVM获取的最大内存大小。

-Xms<size>设置初始Java堆大小

-Xmx<size>设置最大Java堆大小

答案 1 :(得分:0)

如果您使用 Java 7 ,则可以使用Files类:

List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);

String

String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
// or equivalently:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path)));

JAVA 8:

你不需要任何外部课程。使用Stream

try (Stream<String> lines = Files.lines(myPath)) {
    list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
    LOGGER.error("Failed to load file.", e);
}

或者您可以使用第三方库

<强>番石榴

com.google.common.io.Files包含许多有用的方法。

String toString(File, Charset)

List<String> readLines(File, Charset)

Apache CommonsI / O

org.apache.commons.io.IOUtils也提供类似的功能:

String toString(InputStream, String encoding)

List readLines(InputStream, String encoding)

对我而言,Guava非常适合类似的实施。