Запись в реальном времени и удаление последнего символа в файле JAVA - PullRequest
0 голосов
/ 05 мая 2020

Я конвертирую txt в json, и я использую json -simple. Я хочу, чтобы файл записывался в реальном времени, то есть в каждой строке, для этого я решил не использовать JsonArray, потому что, если я использую JSONArray, мне нужно сначала дождаться его завершения, а затем записать его в файл . Поэтому я использую только JsonObjects. Проблема в том, что мне нужно создать «скрытый» JsonArray, для этого в начале и конце файла я добавляю квадратные скобки, а затем к каждому JsonObject я добавляю запятую. Проблема в том, что запятая, очевидно, печатается даже в конце файла перед "]", как мне удалить последнюю запятую?

    br = new BufferedReader(new FileReader(pathFile + ".txt"));
    JSONObject stringDetails = new JSONObject();
    JSONArray stringList = new JSONArray();
    try (FileWriter file = new FileWriter(pathfile+".json",true)) {
                    file.write("[");
                    while ((line = br.readLine()) != null) {
                       //Miss the code to convert from txt string to json string ...
                        stringDetails.put(stringJson.getKey(), stringJson.getMessage());
                        file.write(String.valueOf(stringDetails)+",");
                        stringDetails = new JSONObject();
                    }
                    file.write("]");
                }

Другой вопрос, используя append (true), в В случае если программа остановилась аномальным образом, все предыдущие строки сохраняются?

Большое спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Я вижу два возможных пути, и оба являются важным решением, чтобы не печатать его в первую очередь.

Во-первых: используйте boolean и if-оператор в while l oop для печати запятые перед записями (кроме первой)

boolean isFirst = true;

file.write("[");
while ((line = br.readLine()) != null) {
    //Miss the code to convert from txt string to json string ...
    stringDetails.put(stringJson.getKey(), stringJson.getMessage());

    if (isFirst) {
        isFirst = false;
    } else {
        // print the comma before the new entry
        file.write(",");
    }

    file.write(String.valueOf(stringDetails));
    stringDetails = new JSONObject();
}
file.write("]");

Второй: второй подход - иметь частный вспомогательный метод для печати записи в файл, например:

private static void printEntry(FileWriter file, String line, ... /* what ever else you need*/) {
    //Miss the code to convert from txt string to json string ...
    stringDetails.put(stringJson.getKey(), stringJson.getMessage());
    file.write(String.valueOf(stringDetails));
    stringDetails = new JSONObject();
}

и используйте это, чтобы извлечь запись для первой записи из while l oop, например:

file.write("[");
if ((line = br.readLine()) != null) {
    // print first entry
    printEntry(file, line, ...);

    // print the rest
    while ((line = br.readLine()) != null) {
        file.write(",");

        printEntry(file, line, ...);
    }
}
file.write("]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...