过滤流的作用就是在节点流的基础上提供额外功能。
系统预定义过滤流
处理类型 | 字符流 | 字节流 |
---|---|---|
缓存 | BufferedReader和BufferedWriter | BufferedInputStream和BufferedOutputStream |
过滤处理 | FilterReader和FilterWriter | FilterInputStream和FilterOutputStream |
桥接处理 | InputStreamReader和OutputStreamWriter | |
对象处理 | ObjectInputStream和ObjectOutputStream | |
数据转换 | DataInputSteam和DataOutputStream | |
打印功能 | PrintWriter | PrintStream |
行数统计 | LineNumberReader | LineNumberInputStream |
回滚处理 | PushbackReader | PushbackInputStream |
桥接转换流
用途:实现字节流和字符流之间的自动转换,从字节输入流读取字节数据,并按照编码规范转换为字 符;向字节输出流写出数据时,先将字符按照编码规范转换为字节,然后再进行输出。
使用桥接流时应该指定编码字符集名称,以便实现流转换,如果不指定,则使用当前默认编码字符集
-
InputStreamReader用于将一个InputStream自动转换为Reader
-
OutputStreamWriter用于将一个 Writer自动转换为OutputStream
标准输入流System.in
InputStream in=System.in;
Reader r=new InputStreamReader(in); //使用桥接字符流将字节流转换为字符流
while(true){
System.out.println("请输入:");
int kk=r.read();
if('q'==kk)
break;
System.out.println((char)kk);
}
标准输出流System.out
String str="中国123abc";
Reader r=new StringReader(str);
OutputStream os=System.out; //由于System.out是PrintStream,所以直接输出还是正确
Writer w=new OutputStreamWriter(os); //将字符输出流转换为字节输出流
while(true){
int kk=r.read();
if(kk==-1)
break;
w.write(kk);
}
r.close();
w.close();
InputStreamReader构造器
-
InputStreamReader(InputStream)
-
InputStreamReader(InputStream in, String charsetName) ,例如new InputStreamReader(System.in,"GBK");
-
InputStreamReader(InputStream in, Charset cs),直接使用charsetName编码字符集名称的方式进行设定编码字符集可能会出错,所以可以使用Charset指定编码字符集名称
Charset gbk = Charset.forName("GBK"); //UnsupportedCharsetException
没有指定编码字符集则使用系统默认的编码字符集,允许用户自定义编码字符集,如new InputStreamReader(System.in, "iso8859-1")。iso8859-1是用于欧洲地区的编码字符集,使用的是单字节编码。
OutputStreamWriter构造器和InputStreamReader一致
缓冲流
缓冲流是套接在相应的节点流之上,对读写操作提供缓冲功能,以提高读写的效率,并引入一个新方法
没有使用缓冲流的时间统计 35ms
引入缓冲流:以浪费内存为代价换取高执行效率
缓冲字节流构造器
-
BufferedInputStream(InputStream)不定义缓存大小,则默认8192
-
BufferedInputStream(InputStream,int)人为设置缓冲大小,int单位字节
-
BufferedOutputStream(OutputStream)
-
BufferedOutputStream(OutputStream,int size)自定义缓存区大小
缓冲字符流构造器
-
BufferedReader(Reader)默认缓冲区大小为8192字符
-
BufferedReader(Reader,int)int用于定义缓冲区的大小
特殊方法: readLine():String 用于读取一行数据
-
BufferedWriter(Writer)默认缓冲区大小为8192字符
-
BufferedWriter(Writer,int)int用于自定义缓冲区的大小,单位为字符B
特殊方法
BufferedReader中提供了一个特殊方法readLine():String,但是在BufferedInputStream中并没有这个 方法。可以整行读取数据,以\r或者\n为分隔符(换行符) 如果读取内容为null【 不是-1】,则表示读取到了流末尾 readLine方法的返回值会自动剔除末尾的换行符
BufferedWriter中提供了一个方法newLine可以写入一个换行符
对于输出的缓冲流,写入的数据会受限缓存在内存,使用flush方法可以清空缓存,同时将以前的缓存数 据立即写出
例如:使用java的输入输出流将一个文本文件的内容读取出来,然后添加行号输出到另外一个文件中
public class Test {
public static void main(String[] args) throws Exception {
try (
Reader r = new FileReader("Test1.java");
Writer w = new FileWriter("out.java")
) {
int count = 1;
int kk = 0;
w.write(count+"\t");
while ((kk = r.read()) != -1) {
w.write((char) kk);
if (kk == '\n') {
count++;
w.write(count + "\t");
}
}
}
}
}