2015-08-17 15 views
18

Supponiamo che io sono un java.util.stream.Stream di oggetti con qualche bella metodo toString: Qual è la più breve/soluzione più elegante di scrivere questo flusso in un file, una riga per elemento flusso?Java 8 flusso di file

Per la lettura, c'è il bel metodo Files.lines, quindi ho pensato che ci deve essere un metodo simmetrico per scrivere su file, ma non è stato possibile trovarne uno. Files.write richiede solo un iterabile.

+0

Vedo che c'è un metodo ['File # scrivi (Percorso, Iterable , OpenOption ...)'] (https://docs.oracle.com/javase/8/docs/api/ java/nio/file/Files.html # write-java.nio.file.Path-java.lang.Iterable-java.nio.file.OpenOption ...-) che può aiutarti. –

+0

Forse creare un FileOutputStream e quindi creare un PrintStream? – redxef

+0

@ downvoter: cura di spiegare? @LuiggiMendoza: Sì, l'ho visto anch'io e ho già modificato la mia domanda. Quello prende solo un iterable. Sì, posso convertire, ma non voglio. – knub

risposta

30

Probabilmente la via più breve è quello di utilizzare Files.write insieme al trick che converte il Stream al Iterable:

Files.write(Paths.get(filePath), (Iterable<String>)stream::iterator); 

Ad esempio:

Files.write(Paths.get("/tmp/numbers.txt"), 
    (Iterable<String>)IntStream.range(0, 5000).mapToObj(String::valueOf)::iterator); 

Se sembra troppo hacker, utilizzare più esplicito approccio:

try(PrintWriter pw = new PrintWriter(Files.newBufferedWriter(
        Paths.get("/tmp/numbers.txt")))) { 
    IntStream.range(0, 5000).mapToObj(String::valueOf).forEach(pw::println); 
} 

Se si dispone di flusso di alcuni oggetti personalizzati, è sempre possibile aggiungere il passaggio .map(Object::toString) per applicare il metodo toString().

+0

Quindi, come funziona esattamente? In che modo un cast di 'Iterator' su' Iterable'? – knub

+1

@knub, non è un iteratore, è un riferimento al metodo 'iterator()' (non chiamo il metodo 'iterator()', creo invece il riferimento al metodo). È un uso abbastanza normale del riferimento al metodo, che può essere convertito nel tipo di interfaccia funzionale. –

Problemi correlati