java关闭BufferedReader类的目的是什么?它是否会影响时间/记忆(如果如何)?
黑马21号代码部队竞赛355 Q_A
public class A_VanyaAndFence {
public static void main(String args[])throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int n,h;
n=Integer.parseInt(st.nextToken());
h=Integer.parseInt(st.nextToken());
st=new StringTokenizer(br.readLine());
//int arr[]=new int[n];
int cnt=0;
for(int i=0;i<n;i++){
int a=Integer.parseInt(st.nextToken());
if(a>h){
cnt+=2;
}
else
cnt++;
}
System.out.println(cnt);
}
这个代码花费了155ms,20100kb
public class A_VanyaAndFence {
public static void main(String args[])throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int n,h;
n=Integer.parseInt(st.nextToken());
h=Integer.parseInt(st.nextToken());
st=new StringTokenizer(br.readLine());
//int arr[]=new int[n];
int cnt=0;
for(int i=0;i<n;i++){
int a=Integer.parseInt(st.nextToken());
if(a>h){
cnt+=2;
}
else
cnt++;
}
System.out.println(cnt);
br.close();
}
}
这个代码花了124ms,20100kb
为什么?
# 1 楼答案
即使影响可能不会太大,但当阅读的文本不是太广泛时。这主要是对记忆的影响,其次是对时间的影响,尤其是在阅读大量文本时。close()方法不仅关闭流,还释放与BufferReader/Reader类实现关联的系统资源
文件描述符是操作系统中的一种资源,一旦在BufferReader上调用close(),它就会被释放。在最新版本的Java中,垃圾收集器时不时地运行,应该为您调用close()方法,并处理掉废弃的文件描述符。但在那之前,这个可怜的家伙会在拐角处徘徊
假设您在一个大循环中初始化BufferReader对象,而不是在循环中关闭相同的对象。您的循环可能会在垃圾回收器执行其工作之前提取废弃的文件描述符。 这也是一个很好的编程实践,因为一旦流被关闭,其他BufferReader/Reader方法将通过IOExceptions(另一个close()方法将不起任何作用)
参考:https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#close()
话虽如此,我自己也参与了一个广泛的项目,在这个项目中,关闭每个实例的BufferReader变得很困难,我确实在一些场合避免了它。它对输出和程序执行没有任何值得注意的影响。BufferReader对象最终将被垃圾收集器丢弃。大多数现实世界的应用程序可能对垃圾收集的性能感到满意,并且在时间和内存方面不会显示出任何显著的影响
希望这有帮助