2017-06-14 1 views
8

Für meine spezifische Aufgabe muss ich die Daten von FileChannel zu einem Stream (oder Collection) von String 's lesen.Lesen Sie alle Zeilen von FileChannel zu Stream von Strings

In einer regulären NIO für eine Path können wir eine bequeme Methode verwenden Files.lines(...), die eine Stream<String> zurückgibt. Ich brauche ein gleiches Ergebnis zu erhalten, aber von einem FileChannel statt Path:

public static Stream<String> lines(final FileChannel channel) { 
//... 
} 

Irgendwelche Ideen, wie das zu tun?

Antwort

8

Ich nehme an, Sie den Kanal wollen geschlossen werden, wenn die zurück Stream geschlossen ist, so dass der einfachste Ansatz

public static Stream<String> lines(FileChannel channel) { 
    BufferedReader br = new BufferedReader(Channels.newReader(channel, "UTF-8")); 
    return br.lines().onClose(() -> { 
     try { br.close(); } 
     catch (IOException ex) { throw new UncheckedIOException(ex); } 
    }); 
} 

Es ist eigentlich wäre nicht erforderlich ein FileChannel als Eingang, ein ReadableByteChannel ausreichend ist.

Beachten Sie, dass dies auch zu "regulären NIO" gehört; java.nio.file ist manchmal referred to as “NIO.2”.

+2

oh verdammt, Sie haben gerade einen Fehler in unserer Code-Basis über 'onClose' korrigiert. Danke – Eugene