Topic: thinking in java 里的bug。

  Print this page

1.thinking in java 里的bug。 Copy to clipboard
Posted by: develop8
Posted on: 2006-06-09 08:54

12: The Java I/O System
Changing System.out to a PrintWriter
System.out is a PrintStream, which is an OutputStream. PrintWriter has a constructor that takes an OutputStream as an argument. Thus, if you want, you can convert System.out into a PrintWriter using that constructor:

//: c12:ChangeSystemOut.java
// Turn System.out into a PrintWriter.
import com.bruceeckel.simpletest.*;
import java.io.*;

public class ChangeSystemOut {
//private static Test monitor = new Test();
public static void main(String[] args) {
PrintWriter out = new PrintWriter(System.out, true);
out.println("Hello, world");
/* monitor.expect(new String[] {
"Hello, world"
}); */
}
} ///:~

It’s important to use the two-argument version of the PrintWriter constructor and to set the second argument to true in order to enable automatic flushing; otherwise, you may not see the output. Feedback

----------- thinking in java 3 第4版的一段文章,请允许我在这里引用。
在这里我不明白automatic flusing是什么意思?我一直没明白flusing翻译为中文是
到底是什么意思呢?在这里bruceeckel(thinkinginjava的作者)说:“你必须 把构造器的第2个参数为true,,否则什么也看不到。”但是我把程序修改之后照样能,看到输出的结果:请看我的程序:
我做的修改只是把用完输出流之后,把输出流关掉了,还有把构造器的autoflusing选项设置为false。但我还是能正确看到结果、这是为什么呢?
为什么作者用完流对象后没有把他关掉呢?我真是不明白???大家给个建议吧
用完不关掉流对象他不占用系统资源吗?还是程序结束之后,
一切资源都是释放的?
//: c11:ChangeSystemOut.java
// Turn System.out into a PrintWriter.
import com.bruceeckel.simpletest.*;
import java.io.*;

public class Change2 {
public static void main(String[] args)throws FileNotFoundException {

PrintWriter out =
new PrintWriter(System.out, false);
out.println("hello,world ");
out.print("found IO error ?= "+out.checkError()); // 检查有否错误?
out.close();

}
} ///:~

2.Re:thingking in java 里的bug。 [Re: develop8] Copy to clipboard
Posted by: dzm521
Posted on: 2006-06-09 16:52

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

3.Re:thinking in java 里的bug。 [Re: develop8] Copy to clipboard
Posted by: develop8
Posted on: 2006-06-10 05:39

你真厉害 ! 在哪儿学的啊?

4.Re:thinking in java 里的bug。 [Re: develop8] Copy to clipboard
Posted by: dzm521
Posted on: 2006-06-10 16:12

不好意思!
上面解答的第一段 “ 便不会将缓冲区的内容刷新到System.out中去(注意:PrintWriter中的println()并没有直接将内容写入到System.out中去 ”中的”System.out“应该换成“目标设备”才好,我习惯上面那样说,其实那是错误的。

5.Re:thinking in java 里的bug。 [Re: develop8] Copy to clipboard
Posted by: develop8
Posted on: 2006-06-15 07:14

什么叫好程序,什么叫坏程序?

6.Re:thinking in java 里的bug。 [Re: develop8] Copy to clipboard
Posted by: virmin
Posted on: 2006-06-15 19:46

运行稳定,不会有不可预料的异常出现,代码合理清晰,可理解,容易维护,较易扩展,不会出现低效率问题,就是好程序。当然,你可以对好程序要求更高,因为好没有尽头,但是坏,嘿嘿,多BUG,可读性差,不可维护,难扩展,效率极低,只要沾上一点,就是垃圾程序。

7.Re:thinking in java 里的bug。 [Re: develop8] Copy to clipboard
Posted by: fighttodeath
Posted on: 2006-06-23 21:11

我个人觉得,
这个程序是不会停止的,即OUT对象是不会被关闭的,
因为即使你不输入任何东西,只要你回车,其中的回车换行也已经被写入缓冲区。
所以缓冲区永远不为空。out.close不会被关闭。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923