2013-02-18 14 views
25

Javaでは、私はGZIPInputStreamをFileInputStreamにラップして処理します。 Scalaではどのように同等の処理が行われますか?Scalaでgzipされたファイルを読む方法

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- zip-xml-file-in-scala-codeからの読み込み)が便利かもしれません。 –

答えて

21

あなたがSourceを使用し、Javaの道に全力を尽くすしないようにしたい場合は、[はい、あなたはJavaで何をしていたにラッピングの1以上の層を追加する必要があります。 SourceInputStream秒ですが、Reader秒となりますので、Sourceを2回使用することはできません。

Scalaは、Javaよりも多くの作業を行う必要はありませんが、特にI/Oを使用すると、Javaクラスに戻ってしまうことがあります。

+1

これは 'Gzip'ではなく' GZIPInputStream'でなければなりません – Alexy

5

私は、ストリームの構築中にBufferedInputStreamの使用を排除するであろう:(

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

はすでに入力したものよりもわずかに長く、そして今、あなたはそれを再利用することができますあなたはいつももちろん、独自のショートカットを定義することができます。) - >新しいGZIPInputStream(新しいFileInputStream( "a.csv.gz"))

+0

なぜですか? 'fromInputStream'は基本となるストリームをバッファリングするからですか?これは常に私にとって問題でした:誰がどこでバッファリングしているのかわからない... –

+5

GZIPInputStreamはバッファリング自体をJavaDocからの情報を扱います:GZIPInputStream(InputStream in) - デフォルトのバッファサイズを持つ新しい入力ストリームを作成します512バイトです)。 GZIPInputStream(InputStream in、int size) - 指定されたバッファサイズで新しい入力ストリームを作成します。 – kairius

関連する問題