一,字符过滤流:学习这个流,主要学习它里面的一个api
1,BufferdReader:
按单位分:是字符流
按方向分:是输出流
按功能分:是过滤流(包装流,就是流包装后的流)
java在Windows里面的换行是"\r\n"
java在Linux里面的换行是"\n"
java是跨平台的,但是换了操作系统后,换行不一样了,所以字符过滤流中的一个api可以解决换行问题
1,写的时候#######
2,读的时候#######
注意:字符流不能复制图片,原因是字符流牵扯解码和编码,而图片中会出现一些负数,这些负数在编码表中没有对应的字符就出现了?, 而程序在复制期间就会把这些问号给丢弃掉,所以你发现复制过去的文件大小少了一些字符
二,
设计模式:装饰器设计模式
装饰器设计模式就是基于已有的对象,进行功能增强时,将已有对象以构造器的形式传入,已有对象叫被装饰类,自己定义的类叫装饰器类
例如:装饰器自定义一个BufferedReader
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
class MyBufferedReader{
private Reader in; //关联,把一个类当做另一个类的属性
public MyBufferedReader(Reader in){
this.in=in; //构造器给初始值
}
public String readLine() throws IOException{
StringBuilder sb=new StringBuilder("");
int n;
char c;
while(true){
n=in.read();
c=(char)n;
if(c=='\r'){ //\n\r合起来就是换行的意思
//\r表示光标重新回到本行的开头
continue;
}
if(c=='\n'||n==-1){//\n表示光标往下一行
break;
}
sb.append(c);
}
if(sb.length()>0){
return sb.toString();
}else{
if(c=='\n'){
return sb.toString();
}else{//光标不往下走了就说明读完了
return null;
}
}
}
}
public class Test1 {
public static void main(String[] args) throws IOException {
Reader in=new FileReader("d:/2.txt");
MyBufferedReader mbr=new MyBufferedReader(in);
String line;
while((line=mbr.readLine())!=null){
System.out.println(line);
}