【问题标题】:How to make scanner strings into a Stream in Java? [duplicate]如何在 Java 中将扫描仪字符串转换为 Stream? [复制]
【发布时间】:2015-06-19 03:17:59
【问题描述】:

Java8 中,如何从扫描仪读取结果中形成StreamString

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

这就是将扫描仪变成我想使用forEach 进行迭代的流。

【问题讨论】:

  • 你到底想做什么?不可能有你想要的字符串流。
  • @Radiodef 究竟如何?
  • @BoristheSpider Scanner implements Iterator。所以答案是一样的。 (创建一个Spliterator 并使用StreamSupport。)
  • @Radiodef 聪明。你是对的。

标签: java java-8 java-stream


【解决方案1】:

这一切都错了,不需要Scanner

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()) {

}

如果你真的想使用Scanner,那么就使用implements Iterator,这样你就可以这样做:

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

附:你似乎也没有关闭资源。 总是关闭InputStream

【讨论】:

  • lines 以惰性方式实例化还是br.lines 读取所有行?
  • @StephanRozinsky 这是Stream。你怎么看?
  • 我认为它类似于下面Files.lines 的回答,并且只有在我使用forEach 时才能读取整个文件。我正在学习这些东西,所以还没有信心。
  • @StephanRozinsky 正确。在 Java 8 中,每个 Stream 都是惰性的。
  • 是否单独声明每个对象(InputStream、Reader、BufferedReader)以确保 try-with-resources 清理每个对象?
【解决方案2】:

您根本不必创建Scanner。只是作为URL 的资源。

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

【讨论】:

  • 如果它在类路径上,这将不起作用。
  • @BoristheSpider 哦,是的,我想如果它是 JAR,它就行不通了。
  • Files.readAllBytes(Paths.get(...)) 读取整个文件,而 Files.lines 建立了一个流,如果不对其进行迭代,我将不会读取整个文件 - 所以懒惰会起作用吗?
  • @StephanRozinsky 根据文档,是的。
  • Files.lines 使用BufferedReader,因此它不会逐行读取实际文件。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2019-11-15
相关资源
最近更新 更多