Java 中的字符流学习笔记

 

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(); }}

 

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信