PrintWriter构造器里面的第二个参数设置为true的意思是将缓冲区设置为自动刷新(automatic flushing),如果设置为false,println()便不会将缓冲区的内容刷新到System.out中去(注意:PrintWriter中的println()并没有直接将内容写入到System.out中去,而是将内容写入到缓冲区中直到缓冲区满才刷新,这样做是为了提高效率)。
你修改过的程序之所以能正确输出是因为使用了close(),此方法在关闭流之前会将缓冲区刷新,所以结果正确。
通常情况下在使用完某种流之后(确定程序将不再需要这种流),最好使用close方法将其关闭,以免引起不必要的麻烦,因为当我们创建某种流对象后操作系统此时也将会创建这种流对象所需要的系统资源,如端口,底层I/O的引用等。java垃圾回收器只负责清除在内存中用new创建的流对象,并不会释放操作系统创建的资源。
thinking in java 的作者在这里没有使用close()方法是因为:如果在此程序中使用close()的话,那么即使读者将构造参数改变为false后也看不到这两种设置的区别(因为close方法也有刷新缓冲区的功能,我们在实际中应该养成良好的习惯才好)。
如果你觉得上面的解释还不是很清楚(我的表达水平不高),你可以看看下面的例子:
此例是将在控制台输入的内容打印出来(按回车后),此过程将可以无止的循环操作直到你退出程序,可以将PrintWrite构造器的第2个参数改成false来观察程序运行的不同之出。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class TestSystem {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out, false);
String s;
while(((s = br.readLine()) != null) && args.length == 0){
out.println(s );
}
out.close();
}
}
PrintWriter构造器里面的第二个参数设置为true的意思是将缓冲区设置为自动刷新(automatic flushing),如果设置为false,println()便不会将缓冲区的内容刷新到
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class TestSystem {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out, true);
String s;
while(((s = br.readLine()) != null) && args.length == 0){
out.println(s );
}
out.close();
}
}