Как использовать Java для постепенного чтения строки из файла? - PullRequest
0 голосов
/ 21 марта 2020

Я хочу использовать Java для чтения построчно из входного файла. Лог c кода должен быть:

  1. loadFile () в классе журнала читает первую строку. deltaRecords сохраняет первую строку
  2. В Main class я вызываю loadFile () , и он загружает данные только в deltaRecords , который является 1-й строкой , loadFile () ожидает, пока первая строка не будет проанализирована с помощью testRecords () в Основной класс
  3. loadFile () в классе log читает вторую строку. deltaRecords сохраняет вторую строку
  4. В Main class я вызываю loadFile () , и он только загружает данные в deltaRecords , который является 2-й строкой , loadFile () ожидает, пока 2-я строка не будет проанализирована с помощью testRecords () в Основной класс
  5. loadFile () в классе log читает 3-ю строку. deltaRecords хранит третью строку.

Например, мой входной файл:

TOM 1 2 <br/>
Jason 2 3 <br/>
Tommy 1 4 <br/>

После того, как я прочитал TOM 1 2. Мне нужно остановить процесс и выполнить анализ. Затем я продолжаю читать Джейсон 2. 3.

Вот мой текущий код. В классе журнала я определил loadFile () для чтения ввода построчно. В Main class я определил testRecords () для анализа .:

public void loadFile(String filename) {
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(filename));
        Main main = new Main();
        String line = br.readLine();
        int count = 0;
        while (line != null) {
            if (line.length() == 0) {
                line = br.readLine();
                continue;
            }
            LogRecord record = new LogRecord(line);
            //add record to the deltaRecord
            deltaRecords.add(record);
            //here I need to wait until it has been analyzed. Then I continue read
           //initial the deletaRecords and add current line to the old record

            existRecords.add(record);
            line = br.readLine();
           }
       }catch(Exception e){
            System.out.println("load log file failed! ");
            e.printStackTrace();
       }

В моей основной функции я вызываю loadfile:

Log log = new Log();
log.loadFile("data/output_01.txt");
QueryEngine.queryEngine.log = log;
testRecord(log);

Может кто-нибудь сказать мне, как решить эту проблему? Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 21 марта 2020

Вы можете использовать сканер, чтобы читать файл и обрабатывать построчно. Ниже приведен код сниппета.

public void loadFile(String filename) {
        try {
            Scanner sc= new Scanner(new File(filename));
            while (sc.hasNext()) {
                String line = sc.nextLine();
                LogRecord record = new LogRecord(line);
                //add record to the deltaRecord
                deltaRecords.add(record);
                //here I need to wait until it has been analyzed. Then I continue read next line
               //Place your code here
            }
        } catch (FileNotFoundException fe) {
            System.err.println(fe);
        }
    }
0 голосов
/ 21 марта 2020

Вам не нужно читать строку при создании строковой переменной

Заменить

String line = br.readLine();

на

String line = null;

Вы можете использовать присвоение значений внутри условное

Заменить

while (line != null) {

на

while ((line = br.readLine()) != null) {

В случае пустых строк продолжить

Заменить

            if (line.length() == 0) {
                line = br.readLine();
                continue;
            }

with

            if (line.length() == 0) {
                continue;
            }

Как должен выглядеть ваш код

String line = null;
while ((line = br.readLine()) != null) {
    if (line.length() == 0) continue;
    //Analyze your line
}
0 голосов
/ 21 марта 2020

Вы можете решить ее, используя Consumer лямбда-функцию в качестве входных данных для loadFile следующим образом:

public void loadFile(String filename, Consumer<LogRecord> lineAnalyzer) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(filename));
            Main main = new Main();
            String line = br.readLine();
            int count = 0;
            while (line != null) {
                if (line.length() == 0) {
                    line = br.readLine();
                    continue;
                }
                LogRecord record = new LogRecord(line);
                //add record to the deltaRecord
                deltaRecords.add(record);
                //here I need to wait until it has been analyzed. Then I continue read
                //Analyze line
                lineAnalyzer.accept(record);
                existRecords.add(record);
                line = br.readLine();
           }
       }catch(Exception e){
            System.out.println("load log file failed! ");
            e.printStackTrace();
       }

Затем, когда вы вызываете функцию loadFile, вы можете укажите строку анализа logi c следующим образом:

Log log = new Log();
QueryEngine.queryEngine.log = log;
log.loadFile("data/output_01.txt",logRecord -> {
    System.out.println("Starting analysis on log record "+logRecord);
    // Analyze the log record
    testRecord(log);
});
...