2017-06-14 1 views
8

Pour ma tâche spécifique, j'ai besoin de lire les données de FileChannel à Stream (ou Collection) de String.Lire toutes les lignes de FileChannel au flux de chaînes

Dans un NIO régulier pour un Path nous pouvons utiliser une méthode pratique Files.lines(...) qui renvoie un Stream<String>. Je dois obtenir un même résultat, mais d'un FileChannel au lieu de Path:

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

Toute idée comment faire?

Répondre

8

Je suppose que vous voulez que le canal soit fermé lorsque le retour Stream est fermé, de sorte que l'approche la plus simple serait

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); } 
    }); 
} 

Il ne nécessite pas réellement une FileChannel en entrée, un ReadableByteChannel suffit. Notez que cela appartient également à "régulier NIO"; java.nio.file est parfois referred to as “NIO.2”.

+2

oh darn, vous venez de corriger un bug dans notre base de code via 'onClose'. Je vous remercie – Eugene