JAVA I/O 字符输出流简要概括
偷个懒,直接参考上篇字符输入流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();
}
}
JAVA I/O 字符输出流简要概括的更多相关文章
- java 21 - 2 字符输出流
字符输出流:OutputStreamWriter 构造方法:一共4个,说2个常用的 A:OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 ...
- Java读写文件,字符输入流FileReader 和 字符输出流FileWriter
一个流被定义为一个数据序列.输入流用于从源文件读取数据,输出流用于向目标写数据. 字符输入流FileReader三种读文件方式 package com.shuzf.fileio; import jav ...
- java多线程的字符流与字节流
字节流: package com.wz.thread.stream;import java.io.PipedOutputStream;/** * 字节输入流 * @author Administrat ...
- 字符输出流_Writer类&FileWriter类介绍和字符输出流的基本使用_写出单个字符到文件
java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性的成员方法: - void write(int c) 写入单个字符 - void write(char[] ...
- 字符输出流_Writer类&FileWrite类介绍和字符输出流的基本使用_写出单个字符到文件
字符输出流_Writer类&FileWrite类介绍 java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性抽象方法: void write(int c) ...
- 字符输出流Writer简要概括
偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异: 字符输出流Writer 本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括: 总得来说 ...
- Java将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
java.io 类 BufferedWriter java.lang.Object java.io.Writer java.io.BufferedWriter BufferedWriter publi ...
- 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter
package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...
- Java 之 字符输出流[writer]
一.字符输出流 java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地. 它定义了字节输出流的基本共性功能方法. void write(int c) ...
随机推荐
- Collections.sort的两种用法
http://gwh-08.iteye.com/blog/1233401/ class Foo implements Comparable<Foo>{ @Override public i ...
- [Machine Learning] 深度学习中消失的梯度
好久没有更新blog了,最近抽时间看了Nielsen的<Neural Networks and Deep Learning>感觉小有收获,分享给大家. 了解深度学习的同学可能知道,目前深度 ...
- Hadoop权威指南:FSDataInputStream对象
Hadoop权威指南:FSDataInputStream对象 FileSystem对象中的open()方法返回的是FSDataInputStream对象, 而不是标准的java.io类对象,这个类是继 ...
- 《JAVASCRIPT高级程序设计》第五章(1)
引用类型是一种将数据和功能组合到一起的数据结构,它与类相似,但是是不同的概念:ECMAScript虽然是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和结构等基本结构.引用类型也被称为“对 ...
- db_link
1.查询 SYSDBA登录, sys登录 SELECT * FROM SYS.link$; select owner,object_name from dba_objects where obj ...
- 史上最牛逼的文件bom头清除代码,万能检测清除php,js等等
做php开发,经常部分uft8的php文件因BOM头不同导致各种错误和错位.网上搜到的大部分所谓的去处bom工具都是2货,没有能用的.下面的一段代码,请复制到一个php文件里,然后上传到你的网站根目录 ...
- 阿里云oss总是提示SignatureDoesNotMatch错误怎么办
网上的所有阿里云oss(C#)的例子几乎试遍了,为什么还是提示SignatureDoesNotMatch错误?什么原因?怎么办?下载一个阿里云提供的windows客户端发现,依然提示签名错误. 开始怀 ...
- 解析.NET对象的跨应用程序域访问(下篇)
转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDomain的相关信息,在本篇博文 ...
- MVC View显示详解(RenderBody,RenderPage,RenderSection,Partial)
一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...
- 简单谈谈JavaScript中的this
是夜,想着考量下小黄毛近期的JavaScript进阶如何了,鉴于近期一直在接触Vue 2.0,索性就围绕this编写了个代码片段, 给其一个测量,毕竟写js的程序员都知道,JavaScript的函数调 ...