Экономичный способ добавить к существующему заголовку в существующем файле CSV в Java? - PullRequest
1 голос
/ 12 июля 2020

Я хотел бы изменить первую строку или заголовок существующего файла csv, добавив строку в конец этой строки.

Я пробовал использовать BufferedWriter для этого, но могу получить его только для добавления в конец файла.

Мой рабочий код:

      public static void writeStringtoCsvFile(String filePath, String input) throws IOException {
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(filePath, true)));
    out.append(input);
    out.close();
  }

Кажется, OpenCsv также не имеет доступного метода для добавления в существующий файл. Файл, который мне нужно обработать, имеет размер не менее 160 МБ или 1 + мил записей, был бы альтернативный метод:

  1. BufferedReader для чтения всех строк
  2. Добавьте все, что необходимо, в первую очередь строка
  3. BufferedWriter для записи всего в новый файл

быть слишком медленным? Есть ли более элегантное решение для этого? Спасибо!

1 Ответ

1 голос
/ 12 июля 2020

Файловые системы не позволяют вставлять байты в или удалять байты из середины файла без перезаписи всех байтов после точки вставки / удаления.

Так как файловая система не поддерживает это , API-интерфейсы файлового ввода-вывода Java не могут его поддерживать.

Поскольку API-интерфейсы файлового ввода-вывода Java не поддерживают его, API OpenCvs тоже не могут. (Или, по крайней мере, не без перезаписи файла под обложками.)

Итак, ответ в том, что нет более эффективного способа, чем чтение и запись всех строк файла.

Примечания:

  1. Хотя технически возможно выполнить перезапись файла на месте, безопаснее (и, возможно, эффективнее) создать новый файл, записать в него и переименуйте его, когда запись будет завершена.

  2. Чтение и запись строки за раз (с использованием BufferedReader / BufferedWriter) лучше, чем чтение всех строк в память одновременно, а затем их запись все вон. Особенно, если файлы большие.

...