2013-02-18 42 views
25

在Java中,我会将一个GZIPInputStream封装在FileInputStream中并完成。 Scala中的等价物是如何完成的?如何在Scala中读取gzip'd文件

Source.fromFile("a.csv.gz").... 

FROMFILE返回BufferedSource,这真的想要把世界看成行的集合。

有没有比这更优雅的方式?

Source.fromInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream("a.csv.gz")))) 
+1

这不是*完全*重复,但[这个问题](http://stackoverflow.com/questions/5153544/how-to-从压缩包中读取-xml-files-in-scala-code)可能会有用。 – 2013-02-18 15:54:11

回答

21

如果你想使用Source并没有尽全力Java的方式,那么,你就必须添加到包您在Java在做什么的又一个层。 Source需要InputStream s,但可以给你Reader s,这可以防止你两次使用Source

Scala非常擅长让您从不需要做比Java更多的工作,但是特别是对于I/O,您经常需要回退到Java类。 (你总是可以定义自己的快捷方式,当然:

def gis(s: String) = new GZIPInputStream(new BufferedInputStream(new FileInputStream(s))) 

是只比你已经键入的内容较长,现在你可以重复使用。)

+1

这应该是上面的'GZIPInputStream',而不是'Gzip' – Alexy 2014-04-15 04:54:00

5

我会消除流建设的BufferedInputStream使用 - > new GZIPInputStream(new FileInputStream(“a.csv.gz”))

+0

为什么?因为'fromInputStream'缓冲基础流?这对我来说一直是个问题:我们永远不知道谁在缓冲什么地方... – 2014-11-26 15:20:57

+5

GZIPInputStream处理缓冲本身,来自JavaDoc的信息:GZIPInputStream(InputStream in) - 创建一个默认缓冲区大小的新输入流(我在源代码中看到是512字节)。和GZIPInputStream(InputStream in,int size) - 用指定的缓冲区大小创建一个新的输入流。 – kairius 2014-12-22 09:06:30