我正在尝试使用以下程序读取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解析为字符串吗?或者我应该将文件读入较小的块然后处理它?
答案 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
非常适合类似的实施。