1.字符流是什么?
字符流是可以直接读写字符的IO流
字符流读取字符,首先要读取的是字符数据,然后在转化为字符
字符流写出字符,首先要先字符转化成字节,在写出
2.FileReader
FileReader类的read()方法可以按照字符大小读取
FileReader fr = newFileReader("a.txt");//read()返回值为int,所以要有个int值来接受intd;//遍历这个文件的字符while((d = fr.read()) != -1) {//通过默认码表一次读取一个字符 System.out.print((char)d);}//关闭流fr.close();
3.FileWriter类的write()方法可以自动把字符转为字节写出
FileWriter fw = newFileWriter("a.txt");//在内部把字符转化成字节,在写出fw.write("你好!");//关流fw.close();
4.字符流的拷贝
//字符输入输出流,并设置路径FileReader fr = newFileReader("a.txt");FileWriter fw = newFileWriter("b.txt");ints;//遍历这个文件的字符并写入b.txtwhile((s = (fr.read())) != -1) fw.write(s); //Writer类中有个2k的小缓冲区,如果不关流就会写到缓冲区里//关流fr.close();fw.close(); //关流会把缓冲区的内容刷新出来,在关闭
5.什么情况下使用字符流
字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
读取的时候是按照字符的大小读取的,不会出现半个中文
写出的时候可以直接将字符串写出,不用转换为字节数
6.字符流为什么不可以拷贝非纯文本的文件
因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去。如果是?,直接写出,这样写出之后的文件就混乱了,读取不了
7.自定义字符数组的拷贝
//字符输入输出流,并设置路径FileReader fr = newFileReader("a.txt");FileWriter fw = newFileWriter("b.txt");ints;char[] arr =newchar[1024*8];//创建字符数组//遍历这个文件的字符并写入b.txtwhile((s = (fr.read(arr))) != -1) fw.write(arr,0,s);//从字符数组将数据写到文件上//关流fr.close();fw.close();
8.带缓冲的字符流
//创建字符输入输出流,并设置路径BufferedReader br = newBufferedReader(newFileReader("a.txt"));BufferedWriter bw= newBufferedWriter(newFileWriter("b.txt"));ints;//read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量while((s= br.read()) !=-1)//write一次,是将数据装到字符数组,装满后再一起写出去bw.write(s);//关流br.close();bw.close();
BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率
9.readLine()和newLine()方法
//创建字符输入输出流,并设置路径BufferedReader br = newBufferedReader(newFileReader("a.txt"));BufferedWriter bw= newBufferedWriter(newFileWriter("b.txt"));String s;//readLine是返回值是String,故判断为nullwhile((s= br.readLine()) !=null) {//readLine读取的是一行文本bw.write(s); bw.newLine(); //换行符}//关流br.close();bw.close();
readLine()读取的是一行文本
\r\n 只支持的是windows系统
newLine()支持所有平台的换行
readLine()是属于BufferedReaderd的,FileReader不能调用
newLine()是属于BufferedWriter的,FileWriter不能调用
9.LineNumberReader
setLineNumber() 设置行号
getLineNumber() 获取行号
//创建字符输入输出流,并设置路径LineNumberReader lnr =newLineNumberReader(newFileReader("aa.txt"));String s;//设置当前行号lnr.setLineNumber(5);while((s= (lnr.readLine())) !=null){ System.out.println(lnr.getLineNumber()+": "+s);//获取当前行号}//关流lnr.close();
10.装饰设计模式
在不必改变原类文件和使用继承的情况下,来加强功能
好处:
耦合性不强,被装饰的变化与装饰类的变化无关
interfaceWeapons{//兵器这个接口publicvoidapk();}classswordimplementsWeapons{//创建剑这个类@Overridepublicvoidapk(){ System.out.println("攻击+5"); }}classblacksmithimplementsWeapons{//到铁匠铺去装饰这把剑privatesword s;//获取到被包装的剑这个类的引用publicblacksmith(sword s){//传入被包装的剑这个对象this.s =s; }@Overridepublicvoidapk(){//对剑进行包装升级 s.apk(); System.out.println("风属性+5"); }}classTest{publicstaticvoidmain(String[] args){ blacksmith b = newblacksmith(newsword());//实例化 b.apk(); }}