字符流
什么是字符流?字符流是以字符为单位进行每次读写,一次处理一个unicode。
- java.io.Reader是所有字符输入流的超类。
- java.io.Writer是所有字符输出流的超类。
- 字符流仅适合读写文本数据
字符输入流
Reader的常用方法
int read()
读取一个字符,返回的int值得低16位有效。
int read(char[] cr)
读取长度为数组的长度的字符并且存入数组中。返回值为实际读取到的字符量。
字符输出流
Writer的常用方法
- void writer(int c)写出一个字符,写出一个给定int值低16位的字符
- void writer(char[] chs)将给定字符数组的所有字符写出
- void writer (String str)将给定的字符串写出
- void writer(char[] chs,int offset,int len)将给定的字符数组中从offset处开始连续的len个字符写出
转换流
字符流只能连接在字符流上使用,但是一般节点流都是字节流,我们无法直接将字符流连接在字节流上面,而转换流在之中起到转换器的作用。
字符流和字节流本质上读取的单位是不同的,字符流读取字符,字节流读取字节,读写单位不同。
OutputStreamWriter
使用该流可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并写出。
构造方法:
OutputStreamWriter(OutputStream out,Charset cs)
基于给定的字节输出流和字符编码创建转换输出流
OutputStreamWriter(OutputStream out)
该构造方法会根据系统默认字符集创建转换输出流
InputStreamReader
使用该流可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并写出。
构造方法:
InputStreamReader(InputStream in,Charset cs)
基于给定的字节输出流和字符编码创建转换输出流
InputStreamWriter(InputStream in)
该构造方法会根据系统默认字符集创建转换输出流
缓冲字符输出流与输入流
PrintWriter是具有自动行刷新功能的缓冲字符输出流
- 内部总是连接BufferWriter作为缓冲块写(默认长度为8192长的char数组)文本数据。
- 可以按行写出字符串
- 具有自动行刷新功能
构造器
PrintWriter(File file)
PrintWriter(String fileName)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out,boolean autoFlush)
PrintWriter(Writer writer)
PrintWriter(Writer writer,boolean autoFlush)
其中参数为OutputStream和Boolean的值参数中,布尔类型的值用于表示PrintWriter是否具有自动行刷新。
所谓的自动行刷新就是指的是每当用户向缓冲区中写入换行符时候,会自动自行flush()方法,将写入的内容写到文件之中。
PrintWriter提供了丰富的重载print与println方法
常用方法
void print(int i) //打印整数
void print(char c)//打印字符
void print(boolean b)打印boolean值
void print(char[] c)打印字符数组
void print(double d)打印double值
void print(float f)打印float值
void print(long l)打印long值
void print(String str)打印字符串
上述方法都有println方法
同样的输入流也与之类似。
public PrintWriter(OutputStream out, boolean autoFlush) {
this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
// save print stream for error propagation
if (out instanceof java.io.PrintStream) {
psOut = (PrintStream) out;
}
}
观察源代码发现当我们构造器的参数为字节输出流时候他会自动创建转换流(使用默认字符将字节流转换为字符流),再创建一个缓冲字符流对象。(缓冲区的存在目的就是为了减少与磁盘的交互次数)