关闭Java8流
如果我们使用Java 8流,比如关闭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
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获得相同的效果;陈述第三,流不会直接从文件本身读取,因此文件在完成之前不会被锁定打开,就像在其他一些语言中一样,因此无需关闭它们。这就是我对圣彼得堡的理解