java - 在 Java 中附加到现有 CSV 文件中的现有标头的省时方法?
问题描述
我想通过在该行的末尾添加一个字符串来修改现有 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 记录,替代方法是:
- BufferedReader 读取所有行
- 将任何需要的内容附加到第一行
- BufferedWriter 将所有内容写入新文件
太慢了?有没有更优雅的解决方案?谢谢!
解决方案
文件系统不允许您在不重写插入/删除点之后的所有字节的情况下将字节插入文件中间或从文件中间删除字节。
由于文件系统不支持,Java 文件 I/O API 无法支持。
由于 Java 文件 I/O API 不支持它,OpenCvs API 也不支持。(或者至少在不重写文件的情况下不会。)
因此,答案是没有比读取写入文件的所有行更有效的方法了。
笔记:
虽然在技术上可以对文件进行就地重写,但创建一个新文件、写入文件并在写入完成后重命名它更安全(并且可能更有效)。
一次读取和写入一行(使用 BufferedReader / BufferedWriter)比同时将所有行读入内存,然后将它们全部写出要好。特别是如果文件很大。
推荐阅读
- mongodb - 空结果尝试在数组 Mongodb v4 中查找元素(破坏了兼容性)
- garmin - Connect IQ 小部件能否获取当前播放音频的详细信息
- javascript - JS:声明了“变量”,但从未读取其值
- laravel - 如何使用 Laravel Mix 将 Vue 块文件放在 public/js 中?
- docker - 如何使用 Docker Toolbox for Windows 10 Home 版本更改 DNS
- c# - 将 C# 对象实例组织到静态“全局”类中是否愚蠢/不鼓励
- xml - 如何在自定义扩展中禁用 OOTB entryMergeFilterConfigurableProduct?
- java - 替换 Velocity 中的 XML 值
- ssms-2012 - 更新 SQL Server 数据库中的列标题
- sql-server - SSDT 因删除临时表而崩溃