通过 java.nio 写入带有 BOM 的 UTF-8 编码的文本文件

Write a text file encoded in UTF-8 with a BOM through java.nio

我必须将数据库查询的输出写入 csv 文件。

不幸的是,我公司的很多人都不会使用像 Notepad++ 这样的好用的编辑器,并且一直用 Excel 打开 csv 文件。

当我像这样使用 java.nio 编写 text/csv 文件时

public static void main(String[] args) {
    Path path = Paths.get("U:\temp\TestOutput\csv_file.csv");
    List<String> lines = Arrays.asList("Übernahme", "Außendarstellung", "€", "@", "UTF-8?");

    try {
        Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

文件已成功创建并以 UTF-8 编码。

现在的问题是该文件中缺少 BOM。

没有BOM(Notepad++右下角编码标签显示UTF-8)这对Notepad++来说没问题

但显然是为了 Excel

当我使用 Notepad++ 的选项 Encoding > Convert to UTF-8-BOM 时,保存并关闭它,然后在 Excel 中打开文件,它正确显示所有的值,没有留下任何编码问题。

这导致了以下问题:

我可以在使用 StandardCharsets.UTF-8 时强制 java.nio.file.Files.write(...) 添加 BOM 还是 java.nio 中有任何其他方法来实现所需的编码?

据我所知,在标准 Java NIO 库中没有直接的方法以 BOM 格式编写 UTF-8 文本文件。

但这不是问题,因为 BOM 只是文本流开头的一个特殊字符,表示为 \uFEFF。只需手动将其添加到 CSV 文件中,f.e.:

List<String> lines = 
    Arrays.asList("\uFEFF" + "Übernahme", "Außendarstellung", "€", "@", "UTF-8?");
        ...