PrintWriter和BufferedWriter的区别

最近研究Java Socket编程,经常要对字节输出流和字符输出流打交道,所以在这梳理PrintWriter和BufferedWriter的用法和区别

BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入。通过write()方法可以将获取到的字符输出,然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。并且BufferedWriter只能对字符流进行操作。如果要对字节流操作,则使用BufferedInputStream。

PrintWriter:向文本输出流打印对象的格式化表示形式(Prints formatted representations of objects to a text-output stream)。PrintWriter相对于BufferedWriter的好处在于,如果PrintWriter开启了自动刷新,那么当PrintWriter调用println,prinlf或format方法时,输出流中的数据就会自动刷新出去。PrintWriter不但能接收字符流,也能接收字节流。

Socket编程中,尽量用PrintWriter取代BufferedWriter,下面是PrintWriter的优点:

1. PrintWriter的print、println方法可以接受任意类型的参数,而BufferedWriter的write方法只能接受字符、字符数组和字符串;

2. PrintWriter的println方法自动添加换行,BufferedWriter需要显示调用newLine方法;

3. PrintWriter的方法不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生;

4. PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);

5. PrintWriter的构造方法更广。

-------------------------------------------------------------------

总结:

在使用BufferedReader中的readLine方法接收BufferedWriter中的字符流时,由于readLine是在读取到换行符的时候才将整行字符返回,所以BufferedWriter方法在录入一段字符后要使用newLine方法进行一次换行操作,然后再把字符流刷出去。而PrintWriter由于可以开启自动刷新,并且其中的println方法自带换行操作。所以代码实现起来要比BufferedWriter简单一些。

PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。不过PrintWriter提供println()方法可以写不同平台的换行符,而BufferedWriter可以任意设定缓冲大小。OutputStream可以直接传给PrintWriter(BufferedWriter不能接收),如:

PrintWriter out = new PrintWriter(new BufferedOutputStream(
    new FileOutputStream("foo.out")));

或者用OutputStreamWriter来将OutputStream转化为Wrtier.这时就可以用BufferedWriter了。JDK API documents中都写的很清楚了。

时间: 2024-08-07 00:16:54

PrintWriter和BufferedWriter的区别的相关文章

Android socket 使用PrintWriter和BufferedReader发送和接收出现乱码问题解决

项目中用到了Android和C++的通信,选择了用socket 发送字符的方式,一开始使用的代码是: socket=new Socket(); InetSocketAddress isa = new InetSocketAddress(IP_STR, port); socket.connect(isa, 100); PrintWriter out=new PrintWriter(socket.getOutputStream(),true); BufferedReader recvBuf=new

打印流-PrintStream和PrintWriter

IO包中的其他功能流对象功能流对象特点:解决问题的特有方法. 打印流--必须是输出流(两个都是)PrintStream(字节流) PrintWriter(字符流)特点:打印.不抛异常打印的目的:File对象,字符串路径,字节输出流. 解决的问题:方便的打印各种数据的表示形式. 它的打印方法可以保证数值的表现形式不变.写的是什么样子,目的地就是什么样子 PrintWriter:一样具备打印功能. 目的:File对象,字符串路径,字节输出流,字符输出流. PrintStream实例: import

JAVA基础学习day21--IO流三-File、Properties、PrintWriter与合并、分割流

一.File 1.1.File概述 文件和目录路径名的抽象表示形式. 用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录.此类呈现分层路径名的一个抽象的.与系统无关的视图.抽象路径名 有两个组件: 一个可选的与系统有关的前缀 字符串,比如盘符,"/" 表示 UNIX 中的根目录,"\\\\" 表示 Microsoft Windows UNC 路径名. 零个或更多字符串名称 的序列. 字段摘要 static String pathSeparator 与系

StringWriter/PrintWriter在Java输出异常信息中的作用

闲来无事,看看JUnit的源代码.刚刚开始看就发现一段有趣的代码: public String trace() { StringWriter stringWriter = new StringWriter(); PrintWriter writer = new PrintWriter(stringWriter); thrownException().printStackTrace(writer); StringBuffer buffer = stringWriter.getBuffer(); r

PrintWriter的使用

java.io.PrintWriter 具有自动行刷新的缓冲字符输出流,特点是可以按行写出字符串,并且可以自动行刷新. java.io.BufferedWriter是缓冲字符输出流,内部有缓冲区可以进行块写操作提供效率, 而PrintWriter就是通过连接它实现的缓冲功能(PW的很多构造方法内部自动连接它). PW支持两个直接对文件写操作的构造方法: * PrintWriter(File f)传文件名 * PrintWriter(String s)传路径 以上两种方法都支持一个重载,就是再传入

Java I/O流学习笔记(二)

1. java中有两种类型的流,分别为字节流和字符流.jdk为字节流提供了:InputStream,OutputStream:为字符流提供了Reader以及Writer.    a. 文件在硬盘上的存储方式就是以byte的集合存储的,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘.在读取文件(特别是文本文件)         时,也是一个字节一个字节地读取.    b. 缓冲流,打印流,对象流,文件流,转换流2. 字符流和字节流的区别?   a. 流的概念:在程序中所

Android艺术开发探索——第二章:IPC机制(下)

Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvider ContentProvider是Android中提供的专门用来不同应用之间数据共享的方式,从这一点来看,他天生就是适合进程间通信,和Messenger一样,ContentProvider的底层实现同样也是Binder,由此可见,Binder在Android系统中是何等的重要,虽然Conten

JAVA实验五(网络编程)

实     验    报     告 课程:Java程序设计                         班级:1351            姓名:姜文敏      学号:20135112 成绩:             指导教师:娄嘉鹏              实验日期:2015.6.9 实验密级:         预习程度:             实验时间:15:20-18:00 仪器组次:                 必修/选修:                  实验序号:

Android开发艺术探索读书笔记——进程间通信

1. 多进程使用场景 1) 应用某些模块因为特殊需求需要运行在单独进程中.如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会因为应用程序进程crash而受影响. 2) 为加大一个应用可使用的内存,需要多进程来获取多份内存空间. 2. 如何开启多进程 给四大组件(Activity.Service.Receiver.ContentProvider)在AndroidMainfest中指定android:process属性指定. 如果进程以":"开头的进程,代表应用的私有进程,其