Come leggere gzip piacerebbe file in Scala

In Java, mi piacerebbe avvolgere un GZIPInputStream oltre un FileInputStream e il gioco è fatto. Come è l’equivalente di fatto in Scala?

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

fromFile restituisce un BufferedSource, che vuole davvero vedere il mondo come un insieme di righe.

Non c’è un modo più elegante di questo?

Source.fromInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream("a.csv.gz"))))
  • Non è esattamente un duplicato, ma questa domanda potrebbe essere utile.



2 Replies
  1. 22

    Se si desidera utilizzare Source e non fare tutto il Java modo, allora sì, si dovrà aggiungere un ulteriore strato di avvolgimento a quello che stavi facendo in Java. Source prende InputStreams ma in grado di dare Readers, che impedisce di utilizzare il Source due volte.

    Scala è abbastanza bravo a fare non devi mai fare più lavoro di quanto in Java, ma soprattutto con I/O, è spesso necessario ricorrere a classi Java. (È sempre possibile definire le scorciatoie, naturalmente:

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

    è appena più lungo di quello che hai scritto già, e ora è possibile riutilizzare.)

    • questo dovrebbe essere GZIPInputStream sopra, non Gzip
  2. 6

    Vorrei eliminare BufferedInputStream utilizzo in stream costruzione -> new GZIPInputStream(new FileInputStream("a.csv.gz"))

    • Perché? Perché fromInputStream buffer il flusso sottostante? Questo è sempre stato un problema per me: non si sa mai che buffering cosa, dove…
    • GZIPInputStream gestisce il buffer stesso, info da JavaDoc: GZIPInputStream(InputStream in) – Crea un nuovo flusso di input predefinito dimensione del buffer (che vedo in origine è di 512 byte). E GZIPInputStream(InputStream in, int size) – Crea un nuovo flusso di input con la dimensione del buffer specificato.

Lascia un commento