Каковы пределы вывода файла с моим кодом? - PullRequest
0 голосов
/ 23 октября 2018

Я только что сделал очень простой парсер, который получает входные данные из файла и выводит их в файл.

Он выполняет построчный анализ файла, который вы ему передаете, и выполняет одну и ту же функцию для всехстрок файла, а затем перенаправляет всю строку в другой файл.

Я даю функции parseLine JsonObjectBuilder , чтобы он мог продолжать добавлять json-подобные структуры в выводстрока (это обычный текст для json parser btw).

функция parseFile

private String parseFile(String file) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader (file));
    JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();

    String line;
    try{
      while((line = reader.readLine()) != null){
        parseLine(line, jsonBuilder);
      }
    } finally {
      reader.close();
    }
    return jsonBuilder.build().toString();
  }

Класс парсера

public Parser(String file) throws IOException {
    PrintWriter out = new PrintWriter(System.getProperty("user.dir") + "/parser/src/main/resources/logFormatted.log");
    System.out.println("Initiated Parser class!");
    out.println(parseFile(file));
  }

функция parseLine

private JsonObjectBuilder parseLine(String line, JsonObjectBuilder jsonBuilder){
    String timestamp = null;
    String eventCode = null;
    String payload = null;

    String finalString = null;
    try {
        timestamp = line.substring(0, 23);
        eventCode = line.substring(24, 28);
        payload = line.substring(29, line.length());

        jsonBuilder.add(timestamp, Json.createObjectBuilder()
                      .add("eventCode", eventCode)
                      .add("payload", payload)
                    );
    } catch (Exception ex) {
      System.out.println("ERROR: " + ex);
    }
    return jsonBuilder;
  }

Main

public static void main( String[] args ) throws IOException{
        Parser parser = new Parser(System.getProperty("user.dir") + "/parser/src/main/resources/newFormatLog.log");
    }

Проблема с этим кодом заключается в том, что при его выполнении он анализируется так, как и предполагалосьно не разбирает весь файл.Прямо сейчас я даю ему файл ~ 4550 строк, но он выводит ~ 4400 строк.

Я действительно не знаю почему, и я начинаю думать, что строка слишком велика для обработки иличто-то.Может быть, мне нужно немедленно вывести строки в файл, а не делать окончательный вывод.Вся помощь очень ценится!

1 Ответ

0 голосов
/ 23 октября 2018

Обнаружил проблему.Это было действительно глупо.

public Parser(String file) throws IOException {
    PrintWriter out = new PrintWriter(System.getProperty("user.dir") + "...");
    System.out.println("Initiated Parser class!");

    out.println(parseFile(file));
  }

В этом конструкторе я не закрывал PrintWriter.Просто добавили out.close(); и все заработало как положено.

public Parser(String file) throws IOException {
    try (PrintWriter out = new PrintWriter(System.getProperty("user.dir") + "...")) {

        System.out.println("Initiated Parser class!");
        out.println(parseFile(file));

     }
  }

Вы можете сослаться на этот другой вопрос в качестве ссылки.

РЕДАКТИРОВАТЬ: Добавлено try(PrintWriter out = ...), как предлагается в комментариях

...