如何在Java中以有效方式读取大文本文件数据?

时间:2018-08-23 16:01:01

标签: java file text-files large-data filehandle

我想读取文本文件,其数据最大为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();
    }

1 个答案:

答案 0 :(得分:0)

经过大量分析,我发现我读取文件的方式是将其存储到列表中是不正确的。

因此,在进行自身分析时,我编写了这样的代码,以最大程度地减少读取数据的时间。