黑马程序员技术交流社区

标题: 关于PrinterWriter的问题 [打印本页]

作者: 郭军亮    时间: 2013-4-21 15:37
标题: 关于PrinterWriter的问题
本帖最后由 郭军亮 于 2013-4-22 21:17 编辑

我想问一下PrinterWriter()是字符流还是字节流啊?比如下面这段代码,s.getOutputStream()返回的是字节流,但while((line=bufr.readLine())!=null) 返回的是字符流啊,这是怎么回事呢?  还有希望能够详解一下PrintStream()和PrintWriter()的用法,这个看不太懂,先谢谢了。。。。
                 {
                        out.println(line);
                }

public static void main(String[] args) throws Exception
        {
                Socket s = new Socket("192.168.1.254",10006);

                BufferedReader bufr =
                        new BufferedReader(new FileReader("IPDemo.java"));



                PrintWriter out = new PrintWriter(s.getOutputStream(),true);


                String line = null;
                while((line=bufr.readLine())!=null)
                {
                        out.println(line);
                }

作者: hacket    时间: 2013-4-21 15:53

Writer,OutputStream是字符流还是字节流你总知道吧,它们的子类是字符和字节流,你也应该也知道吧,
不知道赶紧百度,Google,附上两张图片,你就明白了,顺便带上一句,多查API
方法不会用,查API,百度google.


PrintWriter.png (2.3 KB, 下载次数: 17)

PrintWriter.png

PrintStream.png (2.66 KB, 下载次数: 7)

PrintStream.png

作者: _王涛    时间: 2013-4-21 16:51
PrintWriter(OutputStream out, boolean autoFlush)
          通过现有的 OutputStream 创建新的 PrintWriter
作者: 王大斌    时间: 2013-4-21 23:48
首先,PrintWriter是一个字符打印流。也是字符流的成员。
在这里为什么要用PrintWriter

由于你的目标是一个s.getOutputStream()
也就是使用了一个字节流。而你又恰恰想要将一行字符输出到这个流中
String line = null;
while((line=bufr.readLine())!=null)

那么在你输出的时候,既想按行输出,而且还想使用字符形式输出,那么你有两种选择的方式,
1,转换流。
BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
为什么这种方式麻烦呢?不如printWriter好用呢?
首先,它不能再你输出的时候自己加换行符。第二,使用它必须认为的将缓冲区用flush()刷新
while((line=bufr.readLine())!=null)
            {
                    bw.write(line);
                    bw.newLine();
                    bw.flush();
            }
这样才能使你的接受端接收到你的数据。
2,PrintWriter。
  PrintWriter out = new PrintWriter(s.getOutputStream(),true);

参数如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
也就是说你不用自己去刷新缓冲区了,使用println
out.println(line);
通过写入行分隔符字符串终止当前行。
也就是你不同自己写行终止符了,也不同刷新缓冲区了?

爽不爽?你觉得,
这种问题多看看JDK
毕竟以后都要自己学习的,没有人教你



作者: 郭军亮    时间: 2013-4-22 11:08
   我不太理解的是这句话:  PrintWriter out = new PrintWriter(s.getOutputStream(),true);  PrintWriter是字符流,而s.getOutputStream()是字节流,两者怎么联系在一起的?也就是PrintWriter是属于字符流的,为什么能操作字节流?
作者: 王大斌    时间: 2013-4-22 12:58
   我不太理解的是这句话:  PrintWriter out = new PrintWriter(s.getOutputStream(),true);  PrintWriter是字符流,而s.getOutputStream()是字节流,两者怎么联系在一起的?也就是PrintWriter是属于字符流的,为什么能操作字节流?

如果你不理解,可以去看源代码
我来给你读读源代码、、

public PrintWriter(OutputStream paramOutputStream, boolean paramBoolean)
/*      */   {
/*  110 */     this(new BufferedWriter(new OutputStreamWriter(paramOutputStream)), paramBoolean);
/*      */
/*  113 */     if (paramOutputStream instanceof PrintStream)
/*  114 */       this.psOut = ((PrintStream)paramOutputStream);
/*      */   }
这个是java源码中的对PrintWriter的定义。。。

this(new BufferedWriter(new OutputStreamWriter(paramOutputStream))看到么???
这不是转换流吗内部
也就是将你的OutputStreamWriter转换

这跟我上边写的有区别?
1,转换流。
BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));


作者: gerenvip    时间: 2013-4-22 14:27
你可以查看API文档,你所说的是PrintWriter构造函数的问题,下面给你简单总结一下
希望能帮助你明白:
字节打印流:       
PrintStream
构造函数可以接受的参数类型:
1.file对象    File
2.字符串路径  String
3.字节输出流  OutputStream

字符打印流:
PrintWriter 很常用
构造函数可以接受的参数类型:
1.file对象    File
2.字符串路径  String
3.字节输出流  OutputStream
4.字符输出流  Writer

字符打印流PrintWriter比字节打印流PrintStream多一种构造方法,就是PrintWriter中既可以传递字节输出流,也可以传递字符输出流
而PrintStream不能传递字符输出流。

作者: 郭军亮    时间: 2013-4-22 21:17
哦 ,懂了  。谢谢各位了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2