一、过滤流
过滤流就是在节点流的基础上附加功能,在输入之后(后置处理,被装饰对象先执行)或者输出之前(前置 处理,先处理然后被装饰对象执行)进行一下额外的处理,最终实际操作是调用被装饰对象的方法完成工作,依靠这种装饰模式实现在节点流的基础上附加额外功能.当然也允许多个过滤流嵌套从而达到功能累加的目的
自定义流实现循环13加密:
public class Test01 extends FilterReader {
public Test01(Reader re) {
super(re);
}
public int read() throws IOException {
int a = super.read();
if ((a >= 'a' && a <= 'z')) {
a = (a - 'a' + 13) % 26 + 'a';
} else if ((a >= 'A' && a <= 'Z')) {
a = (a - 'A' + 13) % 26 + 'A';
}
return a;
}
}
public class Test02 extends FilterWriter {
public Test02(Writer re) {
super(re);
}
public void write(int c) throws IOException {
if (c >= 'a' && c <= 'z') {
c = (c - 'a' + 13) % 26 + 'a';
} else if (c >= 'A' && c <= 'Z') {
c = (c - 'A' + 13) % 26 + 'A';
}
super.write(c);
}
}
public class Test03 {
public static void main(String[] args) throws IOException {
Writer w = new FileWriter("aa.txt");
Reader r = new FileReader("aaaa");
FilterReader f1 = new Test01(r);
FilterWriter f2 = new Test02(w);
int bb;
while ((bb = f1.read()) != -1) {
System.out.print((char) bb + "\t");
f2.write(bb);
}
f2.close();
}
}
样例:加密: 数字:如果不是9的数字,在原来的基础上加1,比如5变成6, 3变成4,如果是9的数字,变成0。 字母字符:如果是非z字符,向右移动一个,比如d变成e, G变成H,如果是z,z->a, Z-A。字符需要保留大小 写非字母字符:比如‘,&^ 保留不变,中文也保留不变
public class Test04 extends FilterReader {
public Test04(Reader r) {
super(r);
}
public int read() throws IOException {
int a = super.read();
if (a >= '0' && a <= '9') {
a = (a - '0' + 1) % 10 + '0';
} else if (a >= 'a' && a <= 'z') {
a = (a - 'a' + 1) % 26 + 'a';
} else if (a >= 'A' && a <= 'Z') {
a = (a - 'A' + 1) % 26 + 'A';
}
return a;
}
}
public class Test06 {
public static void main(String[] args) throws IOException {
FilterReader f1 = new Test04(new BufferedReader(new FileReader("aa.txt")));
int a;
while ((a = f1.read()) != -1) {
System.out.print((char) a + "\t");
}
}
}
二、桥接转换流
InputStreamReader和OutputStreamWriter提供了字节流和字符流之间的桥接转换功能,用于与字节数据到字符 数据之间的转换,无需编程实现将字节拼接为字符
- 转换流可以在构造时指定其编码字符集
- InputStreamReader用于将一个InputStream类型的输入流自动转换为Reader字符流
- OutputStreamWriter用于将一个Writer字符输出流转换为OutputStream字节输出流
三、缓冲流
1.缓冲流是套接在响应的节点流之上,对续写的数据提供缓冲的功能,提高读写的效率,同时增加了一些新方法
2.以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时 候,其性能表现不佳。为了解决以上弊端,采用缓存流。
3.缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数 据读取完毕,再到硬盘中读取。
构造方法:
- BuàeredReader(Reader)不定义缓存大小,默认8192
- BuàeredReader(Reader in, int size)size为自定义缓冲区的大小
- BuàeredWriter(Writer)
- BuàeredWriter(Writer out, int size)size为自定义缓冲区的大小
- BuàeredInputStream(InputStream)
- BuàeredInputStream(InputStream in, int size)size为自定义缓冲区的大小
- BuàeredOutputStream(OutputStream)
- BuàeredOutputStream(OuputStream out, int size)size为自定义缓冲区的大小
缓冲输入流的方法
- BuàedReader提供了一个方法readLine():String,但是BuàeredInputStream中并没有这个 BuàeredReader提供了readLine方法用于读取一行字符串,以\r或\n分割(换行符) 如果读取内容为null,则表示读取到了流的末尾 readLine方法会自动剔除本行内容末尾的换行符
- BuàeredWriter提供了newLine方法用于写入一个行分隔符 对于输出的缓冲流,写入的数据会先在内存中缓存,使用Öush方法会使内存中的数据立即写出
四、键盘输入
System.in:InputStream用于指代系统默认的输入设备—键盘
方法read():int 可以实现代码执行到这里则会阻塞等待,只要输入数据为止
public class Test08 {
public static void main(String[] args) throws IOException {
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入");
String str = "";
while ((str = re.readLine()).trim().length() > 0) {
if ("quit".equals(str)) {
break;
}
System.out.println(str);
}
re.close();
}
}