2013-02-18 12 views
25

In Java, vorrei avvolgere un GZIPInputStream su un FileInputStream ed essere fatto. Com'è fatto l'equivalente in Scala?Come leggere il file gzip in Scala

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

fromFile restituisce una BufferedSource, che vuole davvero visualizzare il mondo come una raccolta di linee.

Non c'è modo più elegante di questo?

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

Non è * esattamente * un duplicato, ma [questa domanda] (http://stackoverflow.com/questions/5153544/how-to-to read-from-zipped-xml-files-in-scala-code) potrebbe essere utile. –

risposta

21

Se si desidera utilizzare Source e non fare tutto il modo in cui Java, allora sì, si dovrà aggiungere un altro strato di avvolgimento a quello che stavi facendo in Java. Source prende InputStream s ma può darti Reader s, che ti impedisce di usare Source due volte.

Scala è abbastanza bravo a farti non dover fare più lavoro che in Java, ma soprattutto con I/O, spesso devi ricorrere alle classi Java. (È sempre possibile definire le proprie scorciatoie, naturalmente:

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

è poco più lungo di quello che hai digitato già, e ora è possibile riutilizzarlo.)

+1

questo dovrebbe essere 'GZIPInputStream' sopra, non' Gzip' – Alexy

5

Vorrei eliminare l'utilizzo BufferedInputStream nella costruzione flusso -> nuovo GZIPInputStream (nuovo FileInputStream ("a.csv.gz"))

+0

Perché? Perché 'fromInputStream' bufferizza lo stream sottostante? Questo è sempre stato un problema per me: non sappiamo mai chi sta ponendo il buffering su cosa ... –

+5

GZIPInputStream gestisce il buffering stesso, informazioni da JavaDoc: GZIPInputStream (InputStream in) - Crea un nuovo flusso di input con una dimensione del buffer predefinita (che vedo nell'origine è 512 byte). E GZIPInputStream (InputStream in, int size) - Crea un nuovo flusso di input con la dimensione del buffer specificata. – kairius