How to make scanner strings into a Stream in Java? [duplicate]

最后都变了- 提交于 2019-12-19 19:40:28

问题


In Java8, how can I form a Stream of String out of the scanner read results?

InputStream is = A.class.getResourceAsStream("data.txt");
Scanner scanner = new Scanner(new BufferedInputStream(is), "UTF-8");
while (scanner.hasNextLine()) {
    System.out.println(scanner.nextLine());
}

That is turn a scanner into a stream which I would like to iterate using forEach.


回答1:


You are going about this all wrong, no Scanner is required:

try (final InputStream is = A.class.getResourceAsStream("data.txt");
        final Reader r = new InputStreamReader(is, StandardCharsets.UTF_8);
        final BufferedReader br = new BufferedReader(r);
        final Stream<String> lines = br.lines()) {

}

If you really want to use a Scanner then it implements Iterator so you can just do:

public Stream<String> streamScanner(final Scanner scanner) {
    final Spliterator<String> splt = Spliterators.spliterator(scanner, Long.MAX_VALUE, Spliterator.ORDERED | Spliterator.NONNULL);
    return StreamSupport.stream(splt, false)
            .onClose(scanner::close);
}

P.S. you also don't seem to be closing resources. always close an InputStream.




回答2:


You don't have to create a Scanner at all. Just the the resource as a URL.

URL url = A.class.getResource("data.txt");
Files.lines(Paths.get(url.getPath())).forEach(line -> {});


来源:https://stackoverflow.com/questions/29611661/how-to-make-scanner-strings-into-a-stream-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!