我想读取文本文件,其数据最大为250 mb。 该文件具有以下结构。
---------- block 1------
APPLELEM Environment, BASETYPE Environment
APPLATTR Id, BASEATTR id, DATATYPE DT_LONG;
APPLATTR iName, BASEATTR name, DATATYPE DT_STRING;
ENDAPPLELEM;
---------- block 2------
APPLELEM Project, BASETYPE Test
APPLATTR Id, BASEATTR id, DATATYPE DT_LONG;
APPLATTR iName, BASEATTR name, DATATYPE DT_STRING;
ENDAPPLELEM;
---------- block 3------
INSTELEM Project
Id = 1;
iName = "Common";
iDescription = "Global project";
ENDINSTELEM;
INSTELEM Project
Id = 1;
iName = "Common";
iDescription = "Global project";
ENDINSTELEM;
---------- block 4------
INSTELEM Measurement
Id = 1;
iName = "Common";
iDescription = "Global project";
ENDINSTELEM;
INSTELEM Measurement
Id = 1;
iName = "Common";
iDescription = "Global project";
ENDINSTELEM;
---------------
为了理解目的,我写了第1块,第2块。
我想读取所有块的文件,就像我想读取以“ INSTELEM Measurement”开始并以“ ENDINSTELEM”结尾的所有行块一样,并希望将所有此类匹配块的数据存储到List<String>
中这样,如果以后需要的话,我将仅迭代这些行,而不是迭代文件的所有行。
当前,我正在读取文件并将每一行存储到List<String>
中。
但是,每当我要所有以“ INSTELEM Measurement”开头并以“ ENDINSTELEM”结尾的块时,都要花很多时间进行迭代,因为为此,我要一次又一次地迭代整个文件。
最好的方法是什么?
我的示例代码是
List<String> list = new ArrayList<>();
try (Stream<String> stream = Files.lines(Paths.get("d:\\abc.txt"),Charset.forName("Cp1252")))
{
list = stream.collect(Collectors.toList());
}catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
答案 0 :(得分:0)
经过大量分析,我发现我读取文件的方式是将其存储到列表中是不正确的。
因此,在进行自身分析时,我编写了这样的代码,以最大程度地减少读取数据的时间。