A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘圣繁 中级黑马   /  2013-2-20 23:08  /  1442 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

PrintStream PrintWritern 具体的不同

2 个回复

倒序浏览
PrintStream是OutputStream的子类,PrintWriter是Writer的子类
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。
回复 使用道具 举报
 PrintStream类是过滤器类中一个不可忽视的成员,最基本的标准输出就要借助于它——我们常用的System.out变量就是PrintStream实例。与之对应的字符流类是PrintWriter类。
  PrintStream有两个构造函数(在新版API中已标记为过时):
  ■public PrintStream(OutputStream out)
  ■public PrintStream(OutputStream out,boolean autoFlush)
其中,autoFlush置为true时,每当输出遇到换行符,缓冲区的内容就被强制全部输出,如同调用了一次flush()。但要注意,如果没遇到换行符,还是会有数据“憋”在缓冲区里。
  方法(已熟悉的就不解释):
  ■public void write(int b)
  ■public void write(byte b,int offset,int length)
  ■public void flush()
  ■public void close()
  ■public void print(Object obj)
  这个方法功能是 非常强大的,它可以输出任何对象,而不必另加说明。此外print()方法有许多重载形式,即有多种参数。它们是字符串(String)、字符数组 (char[])、字符(char)、整数(int)、长整数(long)、浮点数(float)、双精度浮点数(double)、布尔值 (boolean)。其中,输出多个数单位的print()方法(也就是指参数为String和char[]的)是同步(synchronized)方 法。
  ■public void println()输出一个换行符。
  ■public synchronized void println(Object obj)
  println()方法有9个重载形式,几乎就是print()方法的翻版。唯一的区别在于println()方法都是同步的。
  ■public boolean checkError()
  检查输出过程中有什么错误,如有,返回true值。只要输出流中出现一次错误,则出错后的任意对checkError()的调用均会返回真值。
  下面介绍PrintWriter类。
  如同第二节中所说,PrintWriter是JDK1.1版增加了与字节流I/O相对应的字符流I/O。但是,为了保持兼容性,原先的类几乎没有改 动。再加之调试的需要,PrintStream类被保留,并且System类中的成员变量out、err仍作为它的对象。然而,PrintWriter用 于大多数输出比PrintStream更为合适。因此1.1版的API中建议新开发的代码使用PrintWriter类,并将 PrintStream类的两个构造函数标记为过时。这样,虽然使用System.out输出不会产生问题,在程序中创建新的PrintStream对象 时却会产生编译时的警告。
  PrintWriter类与PrintStream类的方法是对应的。有一个不同之外需提请读者注意,就是当前者的自动清空缓冲区的功能被使能时(构 造函数中autoFlush置为true),仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清 缓冲。
PrintStream,它可以将Java的基本资料型态等资料,直接转换为系统预设编码下对应的字元,再输出至OutputStream中,而这边要介 绍的 PrintWriter其功能上与PrintStream类似,除了接受OutputStream之外,它还可以接受Writer物件作为输出的对象,当 您原先是使用Writer物件在作处理 ,而现在想要套用println()之类的方法时,使用PrintWriter会是比较方便的作法。

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

  2. import java.io.ByteArrayInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.io.PrintStream;
  7. import java.io.PrintWriter;

  8. class test
  9. {
  10.         public static void main(String[] args) {
  11.                 try {
  12.                 byte[] sim = {(byte)0xbc, (byte)0xf2, // 简
  13.                 (byte)0xcc, (byte)0xe5, // 体
  14.                 (byte)0xd6, (byte)0xd0, // 中
  15.                 (byte)0xce, (byte)0xc4}; // 文
  16.                 InputStreamReader inputStreamReader = new InputStreamReader(new ByteArrayInputStream(sim), "GB2312");
  17.                 PrintWriter printWriter =new PrintWriter(new OutputStreamWriter(System.out, "GB2312"));
  18.                 PrintStream printStream =new PrintStream(System.out, true, "GB2312");
  19.                 int in;
  20.                 while((in = inputStreamReader.read()) != -1) {
  21.                 printWriter.println((char)in);
  22.                 printStream.println((char)in);
  23.                 }
  24.                 inputStreamReader.close();
  25.                 printWriter.close();
  26.                 printStream.close();
  27.                 }
  28.                 catch(ArrayIndexOutOfBoundsException e) {
  29.                  e.printStackTrace();
  30.                  }
  31.                 catch(IOException e) {
  32.                  e.printStackTrace();
  33.                 }
  34.                 }
  35. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马