PrintWriter类和PrintStream类的学习总结

来源:互联网 发布:eclipse python import 编辑:程序博客网 时间:2024/05/17 13:07

PrintWriter

1、PrintWriter有8中构造方法。

PrintWriter(OutputStream out) 根据现有的OutputStream创建不带自动刷新的PrintWriter。

PrintWriter(Write out)创建一个不带自动刷新的PrintWriter。

认识到这两个构造方法之后,我们再来看看下面两种:

PrintWriter(OutputStream out,boolean autoFlush)

PrintWriter(Write out boolean autoFlush)

当autoFlush为true时,代表自动刷新。不能指定编码集。


然后PrintWriter能够对文件直接操作的时候用到一下构造:

PrintWriter(File file)使用指定文件创建不具有自动刷新的PrintWriter。

PrintWriter(String fileName)创建具有指定文件名称且不带自动行刷新的PrintWiter。


注意该构造方法无法指定能否自动刷新,但可以指定字符集所有又会有一下2种:

PrintWriter(File file String csn)创建具有指定文件和字符集且不带自动刷新的PrintWriter。

PrintWriter(String fileName,String csn)创建具有指定文件名称和字符集且不带自动刷新的PrintWriter。


2、PrintWriter实现的接口

Closeable接口,所以用close()方法实现对PrintWriter的关闭。

Flushable接口,所以用flush()方法实现认为的刷新。

Appendable接口,所以用append(char c)方法来向此输出流中追加指定的字符


3、PrintWriter的方法

返回值类型为PrintWriter的方法

append(char c)

format(String regex,Object args)以指定格式的字符串和参数写入PrintWriter

printf()

返回类型为void的方法

println(Object obj)打印obj,可以是对象或者基本类型,并换行。

print(Object obj)同上,不换行。

write(int i)写入单个字符i。

write(char[] buf)写入字符数组

write(char[] buf,int off,int len)写入数组的一部分。

write(String s )写入一个字符串

write(String s,int off,int len)写入字符串的一部分

write()方法与print()方法基本一致,但是write(char[] buf,int off,int len)这个方法,print()没有。

推荐使用print方法。

返回值类型为boolean类型的方法

checkError()刷新流并检查其错误的状态。




PrintStream

它是打印输出流,继承与FilterOutputStream,用来装饰其他流,为其他流添加功能使他们能够打印各种数据值表示形式。与其他流不同,PrintStream永远不会抛出IOException;它产生的IOException会被自身的函数所捕获并设置错误标记,用户可以通过checkError()返回错误标记,从而查看内容是否产生了IOException。PrintSteam提供了自动刷新Flush和字符集设置。所谓的自动flush,就是往PrintStream写入的数据会立刻调用flush函数。


/*  * 构造函数 */// 将“输出流out”作为PrintStream的输出流,不会自动flush,并且采用默认字符集// 所谓“自动flush”,就是每次执行print(), println(), write()函数,都会调用flush()函数;// 而“不自动flush”,则需要我们手动调用flush()接口。PrintStream(OutputStream out)// 将“输出流out”作为PrintStream的输出流,自动flush,并且采用默认字符集。PrintStream(OutputStream out, boolean autoFlush)// 将“输出流out”作为PrintStream的输出流,自动flush,采用charsetName字符集。PrintStream(OutputStream out, boolean autoFlush, String charsetName)// 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用默认字符集。PrintStream(File file)// 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用charsetName字符集。PrintStream(File file, String charsetName)// 创建fileName对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用默认字符集。PrintStream(String fileName)// 创建fileName对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用charsetName字符集。PrintStream(String fileName, String charsetName)// 将“字符c”追加到“PrintStream输出流中”PrintStream     append(char c)// 将“字符序列从start(包括)到end(不包括)的全部字符”追加到“PrintStream输出流中”PrintStream     append(CharSequence charSequence, int start, int end)// 将“字符序列的全部字符”追加到“PrintStream输出流中”PrintStream     append(CharSequence charSequence)// flush“PrintStream输出流缓冲中的数据”,并检查错误boolean     checkError()// 关闭“PrintStream输出流”synchronized void     close()// flush“PrintStream输出流缓冲中的数据”。// 例如,PrintStream装饰的是FileOutputStream,则调用flush时会将数据写入到文件中synchronized void     flush()// 根据“Locale值(区域属性)”来格式化数据PrintStream     format(Locale l, String format, Object... args)// 根据“默认的Locale值(区域属性)”来格式化数据PrintStream     format(String format, Object... args)// 将“float数据f对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(float f)// 将“double数据d对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(double d)// 将“字符串数据str”写入到“PrintStream输出流”中,print实际调用的是write函数synchronized void     print(String str)// 将“对象o对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(Object o)// 将“字符c对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(char c)// 将“字符数组chars对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(char[] chars)// 将“long型数据l对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(long l)// 将“int数据i对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(int i)// 将“boolean数据b对应的字符串”写入到“PrintStream输出流”中,print实际调用的是write函数void     print(boolean b)// 将“数据args”根据“Locale值(区域属性)”按照format格式化,并写入到“PrintStream输出流”中PrintStream     printf(Locale l, String format, Object... args)// 将“数据args”根据“默认Locale值(区域属性)”按照format格式化,并写入到“PrintStream输出流”中PrintStream     printf(String format, Object... args)// 将“换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println()// 将“float数据对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(float f)// 将“int数据对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(int i)// 将“long数据对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(long l)// 将“对象o对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(Object o)// 将“字符数组chars对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(char[] chars)// 将“字符串str+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数synchronized void     println(String str)// 将“字符c对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(char c)// 将“double数据对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(double d)// 将“boolean数据对应的字符串+换行符”写入到“PrintStream输出流”中,println实际调用的是write函数void     println(boolean b)// 将数据oneByte写入到“PrintStream输出流”中。oneByte虽然是int类型,但实际只会写入一个字节synchronized void     write(int oneByte)// 将“buffer中从offset开始的length个字节”写入到“PrintStream输出流”中。void     write(byte[] buffer, int offset, int length)

PrintStream和PrintWriter区别

PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。

java的一个字符(char)是16bit的,一个BYTE是8bit的 
PrintStrean是写入一串8bit的数据的。 
PrintWriter是写入一串16bit的数据的。

String缺省是用UNICODE编码,是16bit的。因此用PrintWriter写入的字符串,跨平台性好一些吧。 
PrintStream的可能会出现字符集乱码吧。

PrintStream是用来操作byte, 
PrintWriter是用来操作Unicode, 
一般需要处理中文时用PrintWriter好了

Stream用于二进制文件(非文本) 
Writer/Reader用于文本文件(虽然也是二进制,不过是按照一定的字符编码规则,不像前者) 
当然Stream也可用于文本,只不过比writer/reader来的麻烦 

PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。

区别2:

 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实现了Writer的所有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方法,然后再调用一个没有参数的println()来换行,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。

区别3:

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会是比较方便的作法。 













原创粉丝点击