【问题标题】:Time-efficient way to append to existing header in existing CSV file in Java?在Java中附加到现有CSV文件中的现有标题的省时方法?
【发布时间】:2020-11-01 15:08:34
【问题描述】:

我想修改现有 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 也没有附加到现有文件的可用方法。我需要处理的文件大小至少为 160mb 或 1+mil 记录,是否可以使用替代方法:

  1. BufferedReader 读取所有行
  2. 在第一行添加任何需要的内容
  3. BufferedWriter 将所有内容写入新文件

太慢了?有没有更优雅的解决方案?谢谢!

【问题讨论】:

  • 鉴于您不想附加到文件,但要在整个过程中更改其内容,因此无法重写所有内容。
  • 如果您控制文件的原始创建,那么您可能能够在某些情况下优化此过程。如果您可以在创建文件时在第一行添加一些额外的字节,可能是尾随空格,那么当需要更新它时,您可以使用RandomAccessFile 并覆盖一些额外的字节。

标签: java csv file bufferedreader bufferedwriter


【解决方案1】:

文件系统不允许您在文件中间插入字节或从文件中间删除字节而不重写插入/删除点之后的所有字节。

由于文件系统不支持,Java 文件 I/O API 无法支持。

由于 Java 文件 I/O API 不支持它,OpenCvs API 也不支持。 (或者至少在不重写文件的情况下不会。)

所以,答案是没有比读取写入文件的所有行更有效的方法了。

注意事项:

  1. 虽然在技术上可以对文件进行就地重写,但创建一个新文件、写入文件并在写入完成后重命名它更安全(并且可能更有效)。

  2. 一次读取和写入一行(使用 BufferedReader / BufferedWriter)比同时将所有行读入内存,然后将它们全部写出要好。特别是在文件很大的情况下。

【讨论】:

  • 您能解释一下使用 BufferedWriter 与使用 OpenCsv 库来写入文件吗?哪个更快?
  • 我认为您应该能够使用BufferedWriter 更快地完成此操作,因为您可以避免解析和格式化 CSV 文件行的开销。跨度>
  • 我尝试了上面显示的方法,实际上它似乎附加到文件的最后一行而不是创建一个新行。如果我能让这种方法适用于 FIRST 行就好了,哈哈……这甚至是预期的吗??
  • 是的。这是预期的。您问题中的“工作”代码不正确。您需要按照我在回答中建议的方式实现这一点。从读取器读取行并将它们写入写入器......对第一(标题)行进行特殊处理。
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2020-12-14
  • 2020-12-26
相关资源
最近更新 更多