【问题标题】:Reading & writing text in Scala, getting the encoding right?在 Scala 中读写文本,正确编码?
【发布时间】:2017-09-18 19:03:41
【问题描述】:

我正在使用 Scala 读写一些文本文件。作为该语言的完整初学者,我想确保找到正确的方法来做到这一点,例如正确编码。

所以我found(也在SO)推荐我使用io.Source.fromFile的大部分东西。但是,在像这样尝试之后,读取一个UTF-8文件:

val user_list = Source.fromFile("usernames.txt").getLines.toList
val user_list = Source.fromFile("usernames.txt", enc="UTF8").getLines.toList

我查看了docs,但留下了一些问题。

正确编码

  • 文档显示我可以在Source.fromFile 中设置编码,就像我上面尝试的那样。看着Codec 上的男人和那里列出的types,我想知道这些是否都是我的编解码器选项 - 是否有例如?没有 Utf-16、Big-Endian vs Little-Endian 等?

  • 我对此有点着迷,因为它曾经让我在 Python 中遇到很多麻烦。出于某种原因,这对 Scala 的关注度较低吗?

正确阅读

  • 我查看的所有示例都使用getLines 方法并使用MkStringList 等对其进行后处理。与仅读取整个文件(我的文件很小)在一个文件中相比有什么好处吗去吗?

正确写出

  • 我能找到的每个来源都告诉我 Scala 没有文件写入功能,需要使用 Java FileWriter。我对此感到惊讶——这仍然准确吗?

看着它,我觉得这个问题对于 SO 来说可能有点宽泛,所以如果它不符合要求,我很乐意收回它。在这一点上,我不是在为具体的例子而苦苦挣扎,而是试图以一种我以后不会遇到麻烦的方式进行设置。 谢谢!

【问题讨论】:

标签: scala file text encoding io


【解决方案1】:

Scala 在标准库中只有一个基本的 IO api。在大多数情况下,您只使用 java api。存在来自 java 的体面 api 的事实可能是 Scala 团队不优先考虑拥有强大且功能齐全的 IO api 的原因。

您也可以使用第三方 scala 库。 Better Files 我从未使用过但听说过作为 Scala 文件 api 的好东西。以及提供功能性流式 IO 的 fs2。我敢肯定还有其他人在那里。

对于编码,有许多可能的编码可用。只是只有几个最常见的可用作静态字段,其余的通常通过Codec("Encoding Name") 访问。大多数 api 还允许您直接输入字符串,而无需先获取 Codec 实例。编解码器实际上只是java.nio.charset.Charset 的包装器。您可以运行 java.nio.charset.Charset.availableCharsets() 来查看系统上所有可用的编码。

就阅读而言,如果文件很小,您可以根据需要将它们完全加载到内存中。不这样做的唯一原因是,如果您想避免一次加载整个文件的额外内存使用,如果逐行读取就足够了。出于效率原因,您可能希望使用 Vector 而不是 List(Vector 在许多情况下更好,可能应该首选作为默认集合,但传统和旧习惯很难改掉,大多数人/指南似乎默认使用 List,但这是另一个话题)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2012-01-22
    相关资源
    最近更新 更多