2013-02-18 10 views
25

W Javie otoczyłem GZIPInputStream przez FileInputStream i gotowe. Jak jest równoważny w Scali?Jak odczytać plik gzip'd w Scali

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

fromFile zwraca BufferedSource, który naprawdę chce zobaczyć świat jako kolekcję linii.

Czy nie ma bardziej eleganckiej metody niż ta?

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

To nie jest * dokładnie * duplikat, ale [to pytanie] (http://stackoverflow.com/questions/5153544/how-to- read-from-zipped-xml-files-in-scala-code) mogą być przydatne. –

Odpowiedz

21

Jeśli chcesz użyć Source a nie robić wszystko tak, Java, to tak, będziesz musiał dodać jeszcze jedną warstwę do owijania, co robisz w Javie. Source ma InputStream s, ale może dać Reader s, co uniemożliwia dwukrotne użycie Source.

Scala jest całkiem niezła w tym, że nigdy nie będziesz musiał wykonywać więcej pracy niż w Javie, ale szczególnie przy I/O, często musisz wrócić do klas Java. (Zawsze możesz zdefiniować własne skróty, oczywiście:

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

jest ledwo dłużej niż to, co zostało już wpisane, a teraz można je ponownie wykorzystać.)

+1

to powinno być 'GZIPInputStream' powyżej, a nie' Gzip' – Alexy

5

chciałbym wyeliminować użycie BufferedInputStream w budownictwie strumień -> nowy GZIPInputStream (nowy FileInputStream ("a.csv.gz"))

+0

Dlaczego? Ponieważ 'fromInputStream' buforuje strumień bazowy? Zawsze było to dla mnie problemem: nigdy nie wiemy, kto buforuje to, co ... –

+5

GZIPInputStream obsługuje samo buforowanie, informacje z JavaDoc: GZIPInputStream (InputStream in) - Tworzy nowy strumień wejściowy z domyślnym rozmiarem bufora (który widzę w źródle to 512 bajtów). I GZIPInputStream (InputStream in, int size) - Tworzy nowy strumień wejściowy o określonym rozmiarze bufora. – kairius