字符输出流Writer简要概括
偷个懒,直接参考上篇字符输入流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简要概括的更多相关文章
- 00092_字符输出流Writer
1.字符输出流Writer (1)既然有专门用于读取字符的流对象,那么肯定也有写的字符流对象: (2)查阅API,发现有一个Writer类,Writer是写入字符流的抽象类.其中描述了相应的写的动作. ...
- [19/03/31-星期日] IO技术_四大抽象类_字符流( 字符输入流 Reader、 字符输出流 Writer )(含字符缓冲类)
一.概念 Reader Reader用于读取的字符流抽象类,数据单位为字符. int read(): 读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode ...
- Java 之 字符输出流[writer]
一.字符输出流 java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地. 它定义了字节输出流的基本共性功能方法. void write(int c) ...
- 字符输入流Reader简要概括
字符输入流Reader组成结构 本篇将对JAVA I/O流中的字符输入流Reader做个简单的概括: 总得来说,每个字符输入流类都有一个对应的用途,如下: 字符流基类:Reader 字节流转字符流:I ...
- JAVA I/O 字符输出流简要概括
偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异: 字符输出流Writer 本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括: 总得来说 ...
- Java将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
java.io 类 BufferedWriter java.lang.Object java.io.Writer java.io.BufferedWriter BufferedWriter publi ...
- Java读写文件,字符输入流FileReader 和 字符输出流FileWriter
一个流被定义为一个数据序列.输入流用于从源文件读取数据,输出流用于向目标写数据. 字符输入流FileReader三种读文件方式 package com.shuzf.fileio; import jav ...
- java_缓冲流(字符输出流)
/** 字符缓冲流: * java.io.BufferedWriter extends writer * BufferedWriter:字符缓冲输出流: * * 构造方法: * BufferedWri ...
- Java IO(十二) 字符流 Writer 和 Reader
Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...
随机推荐
- .Net(C#)最简单的邮件发送案例
一.序言 刚开始接触邮件发送功能的时候,在网上找的资料都挺复杂的!对于新手入门有点难(至少对于本人来说,第一次接触的时候确实不容易).这里就写一段简单的邮箱发送代码,备忘,也给新手一个参考(相关类的字 ...
- C#获取 URL参数
假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.te ...
- Struts 2.0全面分析
Struts 2.0 struts 1---前端控制+应用控制+命令模式 webwork ---控制器+拦截器+代理 Struts 2.0 继承了WebWork的设计理念,并没有继承struts 1, ...
- 第 30 章 使用 Emmet 插件
学习要点: 1.安装方式 2.自定义!生成 3.快速生成 主讲教师:李炎恢 本章主要探讨了解一下 Sublime Text3 的一个 HTML5 代码提示插件:Emmet,这个插件比自带原生的要强 ...
- 【FOL】第三周
这周还是在改自己的这个框架,被多线程折腾了两天,最终无奈放弃在游戏启动时调用引擎进行图片相关资源的初始化,当然进展还是不错的. 嗯,下面还是以流水的方式继续记录一下本周完成的工作: 1.调通了客户端与 ...
- opencart 后台导航菜单添加步骤
1,找到在catalog\language\english\common\header.php // Text$_['text_affiliate'] = 'Affiliates';$_['text_ ...
- IO流(四)__流的操作规律总结
流的操作规律: 1.明确源和目的 源:InputStream Reader 目的:OutputStream Writer 2.明确数据是否是纯文本数据 源:是纯文本:Reader 否:InputStr ...
- CSS中的margin、border、padding区别
CSS padding margin border属性详解 图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来 ...
- requirejs:让人迷惑的路径解析
接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模块依赖声明都是很重要的一步.而其中涉及到的模块路径解析,对于新手来说,有的时候会让人觉得 ...
- 原生JS:String对象详解
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...