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

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

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/OutputStreamWriter是InputStream/OutputStream和Reader/Writer之间的桥梁。

PrintStream是OutputStream的子类,PrintWriter是Writer的子类,两者处于对等的位置上,所以它们的API是非常相似的。PrintWriter实现了PritnStream的所有print方法。对于PrintStream,所有println方法都在内部调用相应的print方法,比如println(char x)的方法体就是调用print(x);再写入一个平台相关的换行符。PrintStream构建时会在内部new一个BufferedWriter,所有print方法都在内部调用这个Writer的write方法(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的方法。PrintStream和PrintWriter的auto flushing机制有点不同,前者在输出byte数组、调用println方法、输出换行符或者byte值10(即\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()在进行操作的时候会写入一些与平台有关的行分隔字符,在Unix和Mac OS X下是,在Mac9下是 ,在windows下是。 
第一个问题是println的输出是与平台有关的,所以写入控制台不会产生任何的问题。但是对于网络客户端和服务器而言就会出现大的问题!大多数网络协议,如Http和Gnutela,指明换行应当为。所以使用println能编写出能正常工作的windows下的程序但是不能工作在Unix和Mac下,在加上readLine()中本身的bug,如果让带有prinln()的程序会使得服务器和客户端都挂起。 
      第二个问题是,如果PrintSteam使用的是      所在平台使用的默认编码方式。但是,乐中编码方式并不是服务期或客户端所期望的。例如一个接收XML文件的WEB希望以UTF-8或UTF16编码,但是一个使用PrintStream的WEB服务器可能在中国——本地化环境系统上发送GBK或GB2312的编码的文件,而不管客户端是否期望或理解这些方式。那么出现可能出现编码失败或者挂起。 
      第三个问题是PrintStraem吞掉所有的异常。这就是得PrintStream很适合作为教科书程序,如HelloWorld为了讲受简单的控制台输出,不让学生去理解复杂的异常处理。但是在WEB程序中往往会出现连接中断、带宽提供商的错误、远程系统崩溃和其他不可预知得原因而断开。所以网络程序必须具备处理数据流中意料之外的中断。完成这一点的方法是处理异常。但是PrintStream捕获了低层输出流抛出的所有异常。并且在PrintStream中5个标准的方法并没有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()的分析

附;

利用PrintStream将System.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);

转载于:https://www.cnblogs.com/xingmeng/archive/2013/04/03/2998130.html

java学习笔记------ PrintStream相关推荐

  1. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  2. java学习笔记十三

    11. 凡是继承了FilterOutputStream或FilterInputStream的类都是过滤流,也就是说他们不能直接跟目标(键盘,文件,网络等,节点流可以)数据打交道,只能包装 Intput ...

  3. java学习笔记---5

    IO流 I〇流概述: lO:输入/输出(Input/Output) 流:是一种抽象概念,是对数据传输的总称.也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的: ...

  4. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  5. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  6. 准备写java学习笔记

    准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267

  7. Java学习笔记--StringTokenizer的使用

    2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...

  8. java学习笔记12--异常处理

    java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...

  9. Java学习笔记(十)--控制台输入输出

    输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...

最新文章

  1. Centos下部署Solr 搜索引擎
  2. IUSR_ 计算机名和IWAM_ 计算机名帐户的用户名和密码
  3. 组策略(八)使用使用自定义RealVNC adm模板对域内工作站设置统一标准设置
  4. 后端用python还是php_【后端开发】2019学python还是php
  5. 洛谷 - P3975 [TJOI2015]弦论(后缀自动机)
  6. java fix_Java中的低延迟FIX引擎
  7. Firebug控制台详解
  8. LeetCode 1697. 检查边长度限制的路径是否存在(排序+并查集)
  9. css scale 元素不放大,列元素上的CSS 3动画“transform:scale”对chrome不起作用
  10. 2.1.5编码与调制(1)
  11. MySQL5.7.11免安装版的安装和配置:解决MYSQL 服务无法启动问题
  12. torch --用法
  13. java核心技术.pdf
  14. iReport表达式
  15. 知识图谱构建——Jena推理(三)
  16. epoll精粹二 - Linux C++网络编程(二十三)
  17. com.zxy.android tiny,遇到一个 SIGABRT 这样的错误
  18. hbuild无法与这台计算机上的,HBuilderX无法连接网络
  19. 接入支付宝电脑网站支付实现JAVA版
  20. Candence PCB Si 仿真设计篇1:为仿真文件添加ibis模型

热门文章

  1. 现在公司都不缺人了吗?软件测试工作经历3年居然被坑了?防不胜防
  2. 九宫怎么排列和使用_别人家连客厅茶几都不要了,你却还在纠结挂画怎么挂
  3. mysql s索引 树_mysql 学习 - B+树索引
  4. setup the printer on ubuntu for uniofsurrey
  5. 【matlab】直方图(hist函数的应用)
  6. java使用蒙特卡罗方法计算半径为r圆的面积_不用微积分,如何计算圆面积
  7. Tensorflow2.0数据和部署(四)——Tensorflow高级模型部署
  8. 实现用于意图识别的文本分类神经网络
  9. 【OCR技术】大批量生成文字训练集
  10. 多算法综合的文本挖掘系统