zoukankan      html  css  js  c++  java
  • java学习笔记 PrintStream

    PrintStream,它可以将Java的基本资料型态等资料,直接转换为系统预设编码下对应的字元,再输出至OutputStream中,而这边要介绍的 PrintWriter其功能上与PrintStream类似,除了接受OutputStream之外,它还可以接受Writer物件作为输出的对象,当您原先是使用Writer物件在作处理 ,而现在想要套用println()之类的方法时,使用PrintWriter会是比较方便的作法。 

    下面这个程式显示了PrintStreamPrintWriter两个物件在处理相同输出目的时的作法,程式将会在荧幕上显示 "简体中文" 四个字元: 

    StreamWriterDemo.java
    package onlyfun.caterpillar; import java.io.*;
    public class StreamWriterDemo
    { public static void main(String[] args)
    { try {byte[] sim = {(byte)0xbc, (byte)0xf2, //
      
    (byte)0xcc, (byte)0xe5, //
      
    (byte)0xd6, (byte)0xd0, //
      
    (byte)0xce, (byte)0xc4}; //
      
    InputStreamReader inputStreamReader = new InputStreamReader(new ByteArrayInputStream(sim), "GB2312");
    PrintWriter printWriter =new PrintWriter(new OutputStreamWriter(System.out, "GB2312"));
    PrintStream printStream =new PrintStream(System.out, true, "GB2312");
    int in;
    while((in = inputStreamReader.read()) != -1)
    {printWriter.println((char)in);
    printStream.println((char)in);}
    inputStreamReader.close();
    printWriter.close();
    printStream.close(); }
    catch(ArrayIndexOutOfBoundsException e)
    { e.printStackTrace(); }
    catch(IOException e) { e.printStackTrace(); } }}

    楼主,这两个不存在谁好谁不好的问题,关键要看你编程的时候需要怎么样的功能。在编程语言中,没有所谓的好的坏的之分,有时候看起来很麻烦或是很难操作的函数,实际上有着自己独特的使用之处,在某些特定的编程环境里是有着不可替代的作用的。就像上文所述,当您原先是使用Writer物件在作处理 ,而现在想要套用println()之类的方法时,使用PrintWriter会是比较方便的作法。在特定环境下,使用PrintWriter就会比较方便,这个作用就是printStream无法替代的。

     

    java 输出流中的PrintStream  PrintWriter有什么区别,好像很多场合都能混用
    比如用于网络间通信,发送消息时,可用PrintStream 也可用 PrintWriter
        eg:
             Socket client;
              PrintStream output = new PrintStream(client.getOutputStream());
              output.println("aaa");
              output.flush();
           
     把上例中的 PrintStream 换成PrintWriter效果是一样的。Java I/O流分为两类,字节流和字符流。字节流是指InputStream/OutputStream及其子类,字符流是指Reader/Writer及其子类。这两类I/O流的class hierarchy基本上是对等的,InputStreamReader/OutputStreamWriterInputStream/OutputStreamReader/Writer之间的桥梁。

             PrintStream
    OutputStream的子类,PrintWriterWriter的子类,两者处于对等的位置上,所以它们的API是非常相似的。PrintWriter实现了PritnStream的所有print方法。对于PrintStream,所有println方法都在内部调用相应的print方法,比如println(char x)的方法体就是调用print(x);再写入一个平台相关的换行符。PrintStream构建时会在内部new一个BufferedWriter,所有print方法都在内部调用这个Writerwrite方法(write(String)write(char[])——对于print(char[]),直接调用write(char[]);对于其他的print方法,先用String.valueOf获得参数的字符串表示,然后调用write(String)
            
     对于PrintWriter,所有println方法也都在内部调用print方法,print方法调用write方法。传入OutputStream时,PrintWriter会在内部构造一个BufferedWriter;而传入Writer时,PrintStream内部直接使用该Writer,此时PrintWriter是否进行了缓冲全看该Writer
    所以,对于使用print系列方法的场合,二者没什么区别。

             但是,PrintStream是字节流,它有处理raw byte的方法,write(int)write(byte[],int,int)PrintWriter是字符流,它没有处理raw byte的方法。PrintStreamPrintWriterauto flushing机制有点不同,前者在输出byte数组、调用println方法、输出换行符或者byte10(即\n)时自动调用flush方法,后者仅在调用println方法时发生auto flushing

    System.out
    PrintStream。其实这些东西API文档中都有。

    PrintStream的弊端!

    我们在学习java的第一个程序“Hello World”,就开始使用System.out.println()System.out就是一个PrintStream(当然其他数出流也可以连接public PrintSteam(OutputStream out)public PrintSteam(OutputStream out,boolean autoFlush)在默认情况下显示刷新,如果autoFlush参数为true,则在每输入一个字节数组或换行,或则调用println()时就刷新)。 

          Println()
    在进行操作的时候会写入一些与平台有关的行分隔字符,在UnixMac OS X下是,Mac9下是 ,windows下是。 
    第一个问题是println的输出是与平台有关的,所以写入控制台不会产生任何的问题。但是对于网络客户端和服务器而言就会出现大的问题!大多数网络协议,如HttpGnutela,指明换行应当为。所以使用println能编写出能正常工作的windows下的程序但是不能工作在UnixMac下,在加上readLine()中本身的bug,如果让带有prinln()的程序会使得服务器和客户端都挂起。 
          
    第二个问题是,如果PrintSteam使用的是      所在平台使用的默认编码方式。但是,乐中编码方式并不是服务期或客户端所期望的。例如一个接收XML文件的WEB希望以UTF-8UTF16编码,但是一个使用PrintStreamWEB服务器可能在中国——本地化环境系统上发送GBKGB2312的编码的文件,而不管客户端是否期望或理解这些方式。那么出现可能出现编码失败或者挂起。 
          
    第三个问题是PrintStraem吞掉所有的异常。这就是得PrintStream很适合作为教科书程序,如HelloWorld为了讲受简单的控制台输出,不让学生去理解复杂的异常处理。但是在WEB程序中往往会出现连接中断、带宽提供商的错误、远程系统崩溃和其他不可预知得原因而断开。所以网络程序必须具备处理数据流中意料之外的中断。完成这一点的方法是处理异常。但是PrintStream捕获了低层输出流抛出的所有异常。并且在PrintStream5个标准的方法并没有throws IOException()的声明: 
    public abstract void write();
    public void write(byte[] data);
    public void write(byte[] data,int offset,int length);
    public void flush();
    public void close();
    作为替代PrintStream要依靠一个过时标志。如果在底层出现异常,就会设置这个标志,并且程序员要通过checkError()方法检查此标志的值:public boolean checkError().
    简单地说printStream提供的错误通知对于不可靠的网络连接而言,是不完全的。 
    文章来源:e社会在此还有对readLine()的分析 

    ;

    利用PrintStreamSystem.out重定位于textArea

    import javax.swing.JTextArea;

    import java.io.PrintStream;

    class StreamToTextArea {

      //declare PrintStream and JTextArea

        private static PrintStream ps = null;

        private JTextArea textArea  //constructor

        public StreamToTextArea(final JTextArea textArea) {

          this.textArea=textArea;

        ps = new PrintStream(System.out) {

          public void println(String x) {

            textArea.append(x + "\n");

          }

          public void print(String x){

          textArea.append(x);

          }

        };

        }

        public PrintStream getPs() {

          return ps;

        }

    }

     

     

    调用时:

        StreamToTextArea stt;

        stt=new StreamToTextArea(textArea);

        System.setOut(stt.getPs());

        bst.print(bst.getRoot(),0);

  • 相关阅读:
    PHP编码规范-笔记
    MySQL
    烧毁的诺顿
    页面查询案例(使用redis数据库)
    非关系型数据库-redis
    校验用户名是否存在
    使用Cookie实现浏览器显示上次登录时间
    Java文件下载
    随机验证码生成
    Response对象
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2998130.html
Copyright © 2011-2022 走看看