我正在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和Little-Endian等?
我有点痴迷于此,因为它过去经常在Python中绊倒我。由于某种原因,Scala不太关心它吗?
阅读:
getLines
方法,并使用MkString
或List
等对其进行了后处理。除了阅读整个文件(my)之外,还有什么优势吗?文件很小)一气呵成?正确写出:
FileWriter
。我对此感到惊讶 - 这仍然准确吗? 看着它我觉得SO的问题可能有点宽泛,所以如果它不符合要求,我会很乐意收回它。在这一点上,我并没有挣扎于具体的例子,而是试图以一种我以后不会遇到麻烦的方式进行设置。 谢谢!
答案 0 :(得分:1)
Scala在标准库中只有一个基本的IO api。在大多数情况下,您只需使用java apis。来自java的体面api这一事实可能就是为什么Scala团队没有优先考虑拥有强大且功能齐全的IO api。
但是也可以使用第三方scala库。 Better Files我从未使用过但是作为Scala文件api听到了很多好消息。以及提供功能性流式IO的fs2。我确信那里也有其他人。
对于编码,有许多可用的编码。只有几个最常见的可用作静态字段,其余通常通过sysctl
访问。大多数apis还允许您直接输入String,而不是首先需要获取Codec实例。编解码器实际上只是Cygwin
的包装器。您可以运行Codec("Encoding Name")
以查看系统上可用的所有编码。
就阅读而言,如果文件较小,您可以将它们完全加载到内存中。不这样做的唯一原因是如果你想要避免额外的内存使用一次加载整个文件,如果逐行读取就足够了。出于效率原因,您可能希望使用Vector而不是List(Vector在许多情况下更好,并且应该首选作为默认集合,但传统和旧习惯很难,大多数人/指南似乎默认为List,但这是另一个话题)