Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭Java8流_Java_Java 8_Java Stream - Fatal编程技术网

关闭Java8流

关闭Java8流,java,java-8,java-stream,Java,Java 8,Java Stream,如果我们使用Java 8流,比如list.Stream().filter(..).collect(..)…什么时候关闭这个流 作为下一个示例,我们关闭流是一种好的做法吗 Stream<String> stream = list.stream(); String result = stream.limit(10).collect(Collectors.joining("")); stream.close(); Stream=list.Stream(); 字符串结果=stream.li

如果我们使用Java 8流,比如
list.Stream().filter(..).collect(..)…
什么时候关闭这个流

作为下一个示例,我们关闭流是一种好的做法吗

Stream<String> stream = list.stream();
String result = stream.limit(10).collect(Collectors.joining(""));
stream.close();
Stream=list.Stream();
字符串结果=stream.limit(10.collect)(collector.joining(“”));
stream.close();

通常根本不需要关闭流。您只需要关闭使用IO资源的流

从:

流有一个
BaseStream.close()
方法并实现
AutoCloseable
,但几乎所有流实例在使用后都不需要关闭。通常,只有源为IO通道的流(如
文件返回的流。行(路径、字符集)
)才需要关闭。大多数流由集合、数组或生成函数支持,它们不需要特殊的资源管理。(如果流确实需要关闭,则可以在try with resources语句中将其声明为资源。)

如果需要关闭流,那么最佳做法是使用try with resources语句:

try ( Stream<String> stream = Files.lines(path, charset) ) {
    // do something
}
try(Stream=Files.lines(路径,字符集)){
//做点什么
}

我必须补充一点,默认情况下,流根本不会关闭

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

// "--" is not printed at all:
list.stream().onClose(()->System.out.println("--")).forEach(x -> System.out.println(x));

System.out.println("with try(){}:");

// "--" is printed:
try (Stream<Integer> stream = list.stream() ) {
    stream.onClose(() -> System.out.println("--")).forEach(x -> System.out.println(x));
}
List List=Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//“--”根本不打印:
list.stream().onClose(()->System.out.println(“--”).forEach(x->System.out.println(x));
System.out.println(“with try(){}:”;
//“--”字样打印为:
try(Stream=list.Stream()){
stream.onClose(()->System.out.println(“--”).forEach(x->System.out.println(x));
}

当然,默认情况下,您应该关闭流

流是一种非常通用的API;关键在于,它表示一个数据流,而不需要数据的使用者了解数据的来源

关闭不需要关闭的流没有成本;未能关闭需要关闭的流可能会导致严重问题。您是否确定您正在编写的代码(当前使用的是不需要关闭的数据流)永远不会被重新调整用途以使用不需要关闭的其他类型的数据流


我刚刚完成了大量代码的重构,这些代码过去使用内存中的数据库,而现在使用SQL后端。所讨论的代码大量使用流,这是有充分理由的。将JDBC结果集封装在流中意味着我可以(…我认为)非常容易地实现我的目标。但是我的新流封装了一个需要关闭的资源,而旧流没有。因为最初的开发人员(在本例中是我,我在踢自己)没有关闭流,所以需要进行很多繁琐的调试。

从文档中可以看出:流有一个BaseStream.close()方法并实现自动关闭,但几乎所有流实例在使用后实际上都不需要关闭。通常,只有源为IO通道的流(例如由Files.lines(Path,Charset)返回的流)才需要关闭。大多数流由集合、数组或生成函数支持,它们不需要特殊的资源管理。(如果流确实需要关闭,则可以在try with resources语句中将其声明为资源。)通常不需要关闭流。只有一些访问资源的流,如
DirectoryStream
需要关闭。最好的方法是使用语句。因为它们是懒惰的,所以无法初始化,2。它们实现了
AutoCloseable
,因此打开的流在空闲时被关闭。这是一个重复的流吗?此问题询问是否应关闭流,另一个问题询问在某些特定情况下是否自动关闭流。如果你有可能因为金徽章而单方面关闭问题,至少你应该先仔细阅读。我有一个类似的问题,在阅读了其中一些回答之后,调用关闭方法似乎是一种浪费,原因很多。首先,您必须在每个close方法中添加额外的try-catch块,这可能非常耗时。第二个是,任何close方法都可能只是终止资源,因此您可以使用mystream=null获得相同的效果;陈述第三,流不会直接从文件本身读取,因此文件在完成之前不会被锁定打开,就像在其他一些语言中一样,因此无需关闭它们。这就是我对圣彼得堡的理解