【问题标题】:Write to a file with a specific encoding in Java在 Java 中写入具有特定编码的文件
【发布时间】:2016-09-01 08:29:27
【问题描述】:

可能与我的previous question 有关(关于如何将“för”转换为“för”)

所以我有一个在我的代码中创建的文件。现在我通过以下代码创建它:

FileWriter fwOne = new FileWriter(wordIndexPath);
BufferedWriter wordIndex = new BufferedWriter(fwOne);

有几个

wordIndex.write(wordBuilder.toString()); //that's a StringBuilder

结束(在 while 循环之后)
wordIndex.close();

现在问题是这个文件很大,我想(需要)在不浏览整个文件的情况下跳进去。 RandomAccessFileseek(long pos) 方法让我可以做到这一点。

这是我的问题:我创建的文件中的字符似乎是用 UTF-8 编码的,我在寻找时唯一的信息是我想跳转到的字符位置.另一方面,seek(long pos) 以字节为单位跳跃,所以我没有找到正确的位置,因为 UTF-8 字符可能超过一个字节。

这是我的问题:我可以在编写文件时改用 ISO-8859-15 编写(其中字符是字节)吗?这样seek(long pos) 会让我处于正确的位置。或者我应该尝试使用RandomAccessFile 的替代方法(是否有可以跳转到字符位置的替代方法?)

【问题讨论】:

标签: java encoding utf-8 randomaccessfile iso-8859-15


【解决方案1】:

现在首先令人担忧。 FileWriter 和 FileReader 是旧的实用程序类,它们使用该计算机上的默认平台设置。在其他地方运行该代码将给出不同的文件,将无法从其他位置读取文件。

ISO-8859-15 是单字节编码。但是java以Unicode保存文本,所以它 可以组合所有脚本。 char 是 UTF-16。通常,字符索引不会是字节索引,但在您的情况下它可能有效。但换行符可能是一个 \n 或两个 \r\n 字符/字节 - 取决于平台。

回复

个人认为 UTF-8 已经很成熟了,而且更容易使用:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
string = new String(bytes, StandardCharsets.UTF_8);

这样所有特殊报价、欧元等将始终可用。

至少指定编码:

Files.newBufferedWriter(file.toPath(), "ISO-8859-15");

【讨论】:

  • 非常感谢您的回答。不过这里有个问题。如果我使用完善的 UTF-8,我将如何解决文件搜索问题? (现在我可以用 RandomAccessFile.seek(long pos) 跳转到一个特定的字节位置
  • 可以使用内存映射的 ByteBuffer,使用 Charset.Decoder 查找确切的文件位置,并索引这些位置。所以使用带有“r”(只读模式)的FileChannel进行索引,这样比较快。从示例代码开始。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 2021-04-21
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多