JavaAPI笔记(五)——2. IO字符流 之 Writer相关类
JavaApi笔记(五)——IO流篇
一、字符流Writer类关系图
二、Writer类(抽象类)
-
类说明:此类为字符输出流的抽象类,该类的子类必须实现的是writer(Char[],int,int)方法,flush(),close() 三个方法。实际上大多数子类为了性能或新特性会override一些已定义的方法。
-
唯一字段:
与Reader类一样有lock字段,当Writer子类需要同步时,应该考虑使用writer抽象类提供的lock对象,而不是在子类中使用子类lock对象或synchronized方法。
下面各类核心数据域都至少有这个lock对象,有些省略了 -
核心方法表
序号 | 方法声明 | 功能描述 |
---|---|---|
1 | public abstract void write(char[] cbuf, int off,int len) throws IOException |
将字符数组的一部分输出,含义为将字符数组从offset下标开始连续len个字符输出。 |
2 | public abstract void flush() throws IOException | 从当前对象开始级往上刷新流缓存区并输出到指定地点。 |
3 | public abstract void close() throws IOException | 先flush流后关闭流,一旦流关闭后,后续的writer和flush操作都会造成IOExcepiton抛出。多次关闭同一个流是无效果的。 |
4 | protected Writer(Object lock) | 构造方法,创建一个字符输出流并传入一个用于同步的对象 |
5 | public void write(char[] cbuf) throws IOException | 将一个字符数组内容全部输出 |
6 | public void write(String str) throws IOException | 用法同上,但是传入的是字符串对象 |
7 | public void write(String strint off,int len) throws IOException | 用法同第一条,不同之处 |
8 | public Writer append(CharSequence csq, int start, int end) throws IOException | 调用append和调用write方法没有太大差异。 |
三、BufferedWriter(Writer类直接子类)
-
类描述
BufferedWritter类实现了Closeable、Flushable、Appendable和AutoCloseable接口,主要用于缓冲输出文字。由于没有缓冲的writer方法为即时输出,当writer操作频繁时会导致性能下降。因此BufferedWriter可包装在writer代价大的字符输出类。比如OutputStreamWriter和其子类FileWriter。 -
数据域
只有来自父类Writer定义的同步lock对象。 -
核心方法表
序号 | 方法声明 | 功能描述 |
---|---|---|
1 | public BufferedWriter(Writer out) public BufferedWriter(Writer out, int sz) |
创建缓存字符输出流,可自定义缓冲区大小 |
2 | public void write(char[] cbuf, int off, int len) throws IOException |
将给定数组中的字符存储到此流的缓冲区中,根据需要将缓冲区刷新到底层流。 如果请求的长度大于等于缓冲区长度,将直接把字符写入底层流。因此缓冲区应该较大且合适。 |
3 | public void newLine() throws IOException | 输出由系统属性line.separator定义的行分割符,并不一定是单个换行符(’\ n’)。 |
4 | close、flush、append等其他方法 | 与Writer父类用法无差异 |
四、CharArrayWriter(Writer类直接子类)
-
类描述
CharArrayWriter类也实现了字符缓存区。相比BufferedWriter类,此类输出数据时会自动增大缓冲区,而不是像BufferedWriter类一样缓冲区固定的。
同时还有toCharArray()和toString()方法用于查看缓冲区数据。 -
数据域
序号 | 数据域 | 功能 |
---|---|---|
1 | protected char[] buf | 存储数据的缓冲区。 |
2 | protected int count | 缓冲区中字符数 |
3 | protected Object lock | 继承自Writer类,作为同步时使用的对象 |
- 核心方法
序号 | 方法描述 | 声明 |
---|---|---|
1 | public CharArrayWriter() public CharArrayWriter(int initialSize) |
创建一个新的CharArrayWriter,可自定义初始缓冲区大小 |
2 | public void write(char[] c, int off, int len) | 将数组下标off开始长度为len的数据输出 |
3 | public void writeTo(Writer out) throws IOException | 将缓冲区的内容写入另一个字符流 |
4 | public void reset() | 重置缓冲区,以便您可以再次使用它,而不会丢弃已经分配的缓冲区。 |
5 | public int size() | 返回缓冲区的当前大小 |
6 | public String toString() public char[] toCharArray() |
返回缓存区数据 |
Tips: public void reset() 官方文档说的不清楚。缓冲区加入数据是根据count字段来找存储位置的,其实就是把count字段改为0,但是并不删除原有数据,接下来的缓冲操作会覆盖原数据。
五、FilterWriter(Writer类直接子类)
-
类描述
用于编写过滤后的字符流的抽象类。 抽象类FilterWriter本身提供了将所有请求传递给包含流的默认方法 -
数据域
序号 | 字段 | 功能 |
---|---|---|
1 | protected Writer out | 底层字符输出流 |
2 | protected Object lock | 继承自Writer类,作为同步时使用的对象 |
3.核心方法表
序号 | 方法描述 | 声明 |
---|---|---|
1 | protected FilterWriter(Writer out) | 创建一个新的FilterWriter,底层字符输出流为out |
2 | Writer中定义的其他方法 | 未定义新方法 |
六、OutputStreamWriter(Writer类直接子类)
An OutputStreamWriter is a bridge from character streams to byte streams:Characters written to it are encoded into bytes using a specified charset.
OutputStreamWriter类是字符流转字节流的桥梁流:被写入的字符数据将被以指定的字符集转为字节数据 。
七、FileWriter(OutputStreamWriter子类)
-
类描述
用于以字符流写入文件的类。 该类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。一般结合FileOutputStream 和OutputStreamWriter使用。 -
核心方法(只有构造方法)
序号 | 方法描述 | 声明 |
---|---|---|
1 | public FileWriter(String fileName) throws IOException | 根据文件路径找到文件并构造对象 |
2 | public FileWriter(String fileName, boolean append) throws IOException | 根据文件路径找到文件并构造对象,append为true表示追加模式从文件尾写入,为true则从头写入 |
3 | public FileWriter(File file) throws IOException | 根据文件对象构造FileWriter对象 |
4 | public FileWriter(File file, boolean append) throws IOException | 类似第二条 |
5 | public FileWriter(FileDescriptor fd) | 构造与文件描述符关联的FileWriter对象。 |
八、PipedWriter(Writer类直接子类)
- 类描述
- 核心方法表
序号 | 方法声明 | 功能描述 |
---|---|---|
1 | public PipedWriter(PipedReader snk) throws IOException | 创建连接到指定管道读取器的管道写入器。 然后写入此流的数据来源于snk 。 |
2 | public PipedWriter() | 创建一个尚未连接到管道读取器的管道写入器。 在使用之前,它必须由接收器或发送器连接到管道式读取器。 |
3 | public void connect(PipedReader snk) throws IOException | 将此管道写入器连接到接收器。 如果此对象已连接到其他管道读取器,则抛出IOException 。 |
九、PrintWriter(Writer类直接子类)
-
类描述
将对象的表示格式化为文本输出流。不像PrintStream类,如果启用自动刷新,它只会在调用的println,printf,或format方法来完成,而不是当一个换行符恰好是输出。这个类不会主动抛出异常,需要自己checkError()。 -
数据域
序号 | 数据域 | 说明 |
---|---|---|
1 | protected Writer out() | 基础字符输出流 。 |
2 | protected Object lock | 继承自Writer类,作为同步时使用的对象 |
- 核心方法表
序号 | 方法声明 | 功能描述 |
---|---|---|
1 | PrintWriter(File file) PrintWriter(File file, String csn) |
File输出流输出地址,若文件存在则截断为空文件,若不存在则新建。CSN为支持的字符集。 |
2 | PrintWriter(String fileName) PrintWriter(String fileName, String csn) |
类似第一条,但是传入的是文件名而不是文件对象 |
3 | PrintWriter(OutputStream out) PrintWriter(OutputStream out, boolean autoFlush) |
out为输出流对象;autoFlush如果真的话 , println,printf或format方法将刷新输出缓冲区 |
4 | public PrintWriter(Writer out) public PrintWriter(Writer out) |
类似3,但是传入的是Writer |
5 | boolean checkError() void setError() void clearError() |
用于错误设置和处理,因为PrintWriter不会抛异常 |
6 | void print(XXX xx) | 数值型:double float int long使用XXX.valueOf()转为字符编码后再被转为字节,这些字节是按write(int)方法的方式写的。 Object,char[]、String、char 也是使用默认字符编码后转为字节,也是按write(int)方法的方式写的 |
7 | void println(XXX xx) | 用法类似第六条,但是会自动进行行分割,根据操作系统的line.separator属性进行分隔符确定 |
8 | public PrintWriter printf(String format, Object… args) public PrintWriter printf(Locale l,String format, Object… args) |
l代表是否本地化,format为格式,object为数据对象 |
9 | public PrintWriter format(String format, Object… args) public PrintWriter format(Locale l,String format, Object… args) |
同法同printf |
10 | write 、close、flush等其他方法 | 用法同Writer类 |
十、StringWriter(Writer类直接子类)
-
类描述
在字符串缓冲区中收集其输出的字符流,然后可以用于构造字符串。 -
核心方法
序号 | 方法描述 | 功能说明 |
---|---|---|
1 | public StringWriter() public StringWriter(int initialSize) |
创建一个新的字符串写入程序,可自定义缓冲区大小。 |
2 | public StringBuffer getBuffer() | 返回字符串缓冲区本身。 |
3 | public String toString() | 以缓冲区的当前值作为字符串返回。 |