返回 登录
0

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.txt
while((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.txt
while((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,故判断为null
while((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{//创建剑这个类
@Override
publicvoidapk(){
 System.out.println("攻击+5");
 }
}

classblacksmithimplementsWeapons{//到铁匠铺去装饰这把剑
privatesword s;//获取到被包装的剑这个类的引用
publicblacksmith(sword s){//传入被包装的剑这个对象
this.s =s;
 }
@Override
publicvoidapk(){//对剑进行包装升级
 s.apk();
 System.out.println("风属性+5");
 }
}
classTest{
publicstaticvoidmain(String[] args){
 blacksmith b = newblacksmith(newsword());//实例化
 b.apk();
 }
}

学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:279558494 我们一起学Java!

评论