偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异;

字符输出流Writer

本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括:

总得来说,每个字符输出流类都有一个对应的用途,如下:

    • 字符输出流基类:Writer
    • 字节流转字符流:OutputStreamWriter              //往字节输出流中写字符
    • 字符文件写入相关:FileWriter                          //往文件中写字符
    • 字符数组转字符流:CharArrayWriter                //往字符数组中写字符
    • 线程内部通信(管道):PipedWriter                    //往管道中写字符
    • 字符串转字符流:StringWriter                        //往StringBuffer中写入字符,构造字符串
    • 缓冲流:BufferedWriter                                //可装饰其它字符输出流,增加缓冲功能
    • 过滤流:FilterWriter                                     //可装饰其它字符输出流,增加过滤功能
    • 格式化写入字符:PrintWriter:                       //可装饰其它字符输出流,增加格式化写入的数据等功能

再看下Writer的组成结构(下图,包括字符输入流Reader);

下面将对各个字符输出流做个详细介绍;

OutputStreamWriter

OutputStreamWriter继承字符流抽象类Writer,每个构造方法都包含一个字节流OutputStream入参,可以让我们往字节输出流中写入字符

PS:无论是构造方法里对字节流的处理(StreamDecoder.forOutputStreamWriter),还是字符流的读取(StreamDecoder.write),底层都是通过StreamDecoder类实现的,有兴趣的可以深入了解~

举个例子,如下,为方便阅读,不做异常处理:

package com.pichen.io;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer; public class IOTest {
public static void main(String[] args) throws IOException {
//通过“标准”字节输出流得到一个字符输出流
Writer writer = new OutputStreamWriter(System.out);
//往字符流写入字符
writer.write("hello~");
//关闭流
writer.close();
}
}

FileWriter

FileWriter继承字符流OutputStreamWriter,本地文件写入字符,查看其构造方法,都是先根据传入的参数生成一个FileOutputStream字节流对象,然后调用父类OutputStreamWriter的构造方法得到字符流;

举个简单的例子:

package com.pichen.io;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer; public class IOTest {
public static void main(String[] args) throws IOException {
//得到字符输出流
Writer writer = new FileWriter("C:\\test.txt");
//写入字符
writer.write('a');
//刷新该流的缓冲
writer.flush();
//关闭流
writer.close();
}
}

CharArrayWriter

CharArrayReader可以让我们字符数组中写入字符,在构造方法里可以指定字符数组大小,且后续在write的过程中,会自动增大该字符数组;

举个简单的例子:

package com.pichen.io;

import java.io.CharArrayWriter;
import java.io.IOException; public class IOTest {
public static void main(String[] args) throws IOException { //创建字符流,指定初始缓冲区大小
CharArrayWriter writer = new CharArrayWriter(6); //写入字符
writer.write("aaabbb"); //从字符输出流中得到字符数组
System.out.println(writer.toCharArray()); //关闭流
writer.close();
}
}

PipedWriter

可以通过PipedWriter和PipedReader创建字符流管道,线程间可以通过管道进行通信,注意:一定要同一个JVM中的两个线程;

PipedWriter一般是要和PipedReader配合使用的,其中一个线程通过PipedWriter往管道写数据,另一个线程通过PipedReader从管道读数据,注意读写都会阻塞线程,如下示例:

package com.pichen.io;

import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class IOTest {
public static void main(String[] args) throws IOException {
final PipedWriter pw = new PipedWriter();
final PipedReader pr = new PipedReader(pw); ExecutorService es = Executors.newFixedThreadPool(2); es.execute(new Runnable() { @Override
public void run() {
try {
pw.write("hello~");
} catch (IOException e) {
e.printStackTrace();
}
}
}); es.execute(new Runnable() { @Override
public void run() { char[] cbuffer = new char[6];
try {
// 会导致线程阻塞
pr.read(cbuffer, 0, 6);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(cbuffer); }
});
}
}

BufferedWriter

这个字符流可以用来装饰其它字符输出流,可以为其它字符输出流提供字符输出缓冲区,到时一次性写入,避免每次都一个字节一个字节往外部媒介中写入数据,这里用到了设计模式里的装饰器模式,可以参考我之前写的,

http://www.cnblogs.com/chenpi/p/5173818.html

被装饰的字符流可以有更多的行为,比如newLine方法等;

举个使用的例子,读取外部文件:

package com.pichen.io;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; public class IOTest {
public static void main(String[] args) throws IOException {
// 创建一个缓冲字符输出流,这里设定缓冲区大小为10k
BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\test.txt"), 10 * 1024); // 往缓冲区写入字符
writer.write("aaa");
writer.newLine();
writer.write("bbb"); // 关闭流
writer.close();
}
}

FilterWriter

抽象类FilterWriter是实现自定义过滤输出字符流的基类,从源码的实现上来看,仅仅只是简单覆盖了Writer中的所有方法,感觉没什么卵用,因为已经有一个抽象类Writer了;

StringWriter

字符输出流,可以构造字符串,其内部是通过StringBuffer实现的,

举个简单的使用例子

package com.pichen.io;

import java.io.IOException;
import java.io.StringWriter; public class IOTest {
public static void main(String[] args) throws IOException { StringWriter writer = new StringWriter(); writer.write("hello ");
writer.write("world~"); System.out.println(writer.toString());
}
}

PrintWriter

允许将格式化数据写入到字符输出流中,如下示例,将格式化数据写到控制台上;

package com.pichen.io;

import java.io.IOException;
import java.io.PrintWriter; public class IOTest {
public static void main(String[] args) throws IOException { PrintWriter writer = new PrintWriter(System.out); writer.write("hello ");
writer.write("world~"); writer.printf("%5d", 101); writer.close();
}
}

字符输出流Writer简要概括的更多相关文章

  1. 00092_字符输出流Writer

    1.字符输出流Writer (1)既然有专门用于读取字符的流对象,那么肯定也有写的字符流对象: (2)查阅API,发现有一个Writer类,Writer是写入字符流的抽象类.其中描述了相应的写的动作. ...

  2. [19/03/31-星期日] IO技术_四大抽象类_字符流( 字符输入流 Reader、 字符输出流 Writer )(含字符缓冲类)

     一.概念 Reader Reader用于读取的字符流抽象类,数据单位为字符. int read(): 读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode ...

  3. Java 之 字符输出流[writer]

    一.字符输出流 java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地.   它定义了字节输出流的基本共性功能方法. void write(int c) ...

  4. 字符输入流Reader简要概括

    字符输入流Reader组成结构 本篇将对JAVA I/O流中的字符输入流Reader做个简单的概括: 总得来说,每个字符输入流类都有一个对应的用途,如下: 字符流基类:Reader 字节流转字符流:I ...

  5. JAVA I/O 字符输出流简要概括

    偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异: 字符输出流Writer 本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括: 总得来说 ...

  6. Java将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    java.io 类 BufferedWriter java.lang.Object java.io.Writer java.io.BufferedWriter BufferedWriter publi ...

  7. Java读写文件,字符输入流FileReader 和 字符输出流FileWriter

    一个流被定义为一个数据序列.输入流用于从源文件读取数据,输出流用于向目标写数据. 字符输入流FileReader三种读文件方式 package com.shuzf.fileio; import jav ...

  8. java_缓冲流(字符输出流)

    /** 字符缓冲流: * java.io.BufferedWriter extends writer * BufferedWriter:字符缓冲输出流: * * 构造方法: * BufferedWri ...

  9. Java IO(十二) 字符流 Writer 和 Reader

    Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...

随机推荐

  1. 如何在Web项目中给没有添加API核心组件添加APIController的帮助页HelpPage

    前言: ASP.NET中的Web项目可以通过APIController控制器来为其他项目提供接口.  而我们在调试这些接口时,可以选择单元测试,网页测试(Get接口),自己写测试代码或者第三方测试工具 ...

  2. Java的HashSet类

    如果要查找一个集合中是否包含了某个对象,那么就需要把这个对象和这个集合中的每个对象依次进行比较和判断,直到找到这个对象为止,或者把所有对象都比较一次为止(如果最后一个对象才是要查找的对象,或者集合中没 ...

  3. hibernate---注释 ----(购物:人顾客售货员boss)

    package com.ij34.dao; import javax.persistence.*; @Entity @Inheritance(strategy=InheritanceType.JOIN ...

  4. MongoVUE(MongoDB图像管理工具)

    介绍一款很不错的开源的MongoDB图形化管理工具:MongoVUE 下载地址:MongoVUE 1.6.9 破解版

  5. 关于mybatis 的mapper namespace 作用及解析

    因为语言惯性,大部分的namespace 在语言级别*来说是作为一种限定性标识来用,起到唯一或一类的标识.来看看语言(以PHP语言为例)上的namespace的作用实例 一.namespace 在PH ...

  6. handlebars模板替换

    <html> <head> <meta charset="UTF-8" /> <!-- <script type="tex ...

  7. 应用服务器和Web服务器

    如上图所示,绝大部分的公司会采用Apache+tomcat集群(或jetty集群)来部署公司的Web服务, Web服务器和应用服务器关系,先介绍一下我们常说的服务器: Tomcat服务器,是运行ser ...

  8. Spring面试基本问题(1)

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  9. 七个结构模式之桥接模式(Bridge Pattern)

    问题: 当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响. 定义: 将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分 ...

  10. 64位系统使用Access 数据库文件的彻底解决方法

    最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没 ...