1.码表
(一)码表种类
ASCII:美国标准信息交换码,用一个字节的7位可以表示
ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示,对ASCII没用到空间补充了自己特有的
GB2312:中国的中文编码表。
GBK: 中国的中文编码表升级,融合了更多的中文文字符号。
Unicode: 国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。
UTF-8: 最多用三个字节来表示一个字符。
(二)注意
不同的码表对应可能是不一样的;例如:中国 在gbk中对应100 200 在big5中可能就是? …
GBK:两个字节包含的英文,和扩展的中文
utf-8:万国码表,推行,1~3个字节,英文1个字节,中文3个字节,是为了节省空间
(三)编码解码
编码:getByte();解码:new String(byte,[码表])
2.字符流
(一)字节流与字符流区别
字节流读取的是文件中的二进制数据,读到的数据并不会帮你转换成你看得懂的字符。
字符流会把读取到的二进制的数据进行对应的编码与解码工作。字符流 = 字节流 + 编码(解码)
一般操作文字类的用字符流,操作文件,图片类的用字节流
(二)分类
a.Reader:输入字符流的基类,抽象类
子类:1.FileReader
用法: 1. 找到目标文件
2. 建立数据的输入通道
3. 读取数据
4. 关闭资源FileReader
例子:
public static void readTest1(String path) throws IOException{
File f=new File(path);
FileReader fr=new FileReader(f);
char[] buffer=new char[1024];
int length=0;
while((length=fr.read(buffer))!=-1){
System.out.print(new String(buffer,0,length));
}
fr.close();
}
2.BufferedReader:和之前所说的缓冲流的差不多内部都维护了一个字符数组
不仅增加读取效率也扩展了功能
缓冲流本身不具备读写能力记住这些能力都是传进来的对象给的
例子:
public static void bufferReader(String path) throws IOException{
File f=new File(path);
FileReader fr=new FileReader(f);
BufferedReader br=new BufferedReader(fr);
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
b.Writer:输出字符流,抽象类
子类:1.FileWriter
用法:1. 找到目标文件。
2. 建立数据输出通道
3. 写出数据。
4. 关闭资源
注意:1.FileWriter内部维护了一个1024字符数组,写数据的时候先是将数据存到内存数组中,想要将数据真正写到磁盘中需要调用flush()/close()/填满了内存数组
2.目标文件要是不存在,会自动创建
3.如果目标文件存在,且其中有数据,写数据时想要在后面添加数据,创建FileWriter(file,true),第二个参数要是true
例子:
public static void writeTest1() throws IOException{
File f=new File("C:a.txt");
FileWriter fw=new FileWriter(f);//如果目标文件不存在自动创建
String content="今天天气很好哦";
fw.write(content);
fw.close();
}
2.BufferedWriter: 缓冲输出字符流
提高FileWriter的写数据效率与拓展FileWriter的功能。
BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能
例子:
public static void bufferWriter(String path) throws IOException{
File f=new File(path);
FileWriter fw=new FileWriter(f);
BufferedWriter bw=new BufferedWriter(fw);
String content="nnihao asdkfalskdfha faklhdf adkfh adf";
//bw.newLine();//换行
bw.write(content);
}
(三)综合例子
3.装饰者设计模式
(一)出现原因
当我们想要给一个类添加一个功能的时候,一般我们用的是继承这个类再添加特定功能,这样的好是好,但是当我们想要给这个类添加很多功能的时候,因为之间没有联系,导致继承体系很大->这时候我们会想什么样的设计模式能在各个子功能互相调用,这样好处互相装饰,调用灵活-》出现了“装饰设计者模式”
(二)原理
达到互相装饰的功能需要:一个功能a,一个功能b,需求是功能c有功能a,b这时候装饰设计者模式就发挥作用,通过用b再装饰a达到a,b功能都有的c功能
在装饰类中有一个被装饰类,之后就在这个装饰类中调用被装饰类的方法,在添加上自己的方法,为了能够使这种类型的装饰类能被其他装饰类互相调用达到功能更丰富的装饰类,而这个被装饰类可以是其他装饰类,这里要能互相调用,需要用到泛型的概念,这里就需要在这些装饰类有一个共同的父类或父接口
(三)步骤
1.在装饰类内部维护一个被装饰类的引用
作用:调用被装饰类的方法再添加自己的方法
2.在各装饰类有一个共同的父类或者父接口
作用:装饰类之间互相装饰
(四)例子:
//使用下面的装饰设计
public class zhuangShisjmo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File f=new File("C:/a.txt");
FileReader fr=new FileReader(f);
BufferedReader bufferedReader=new BufferedReader(fr);
//Test1(bufferedReader);
//Test2(bufferedReader);
Test3(bufferedReader);
}
public static void Test1(BufferedReader bufferedReader) throws IOException{
bufferedLineNum buffln=new bufferedLineNum(bufferedReader);
String line=null;
while((line=buffln.readLine())!=null){
System.out.println(line);
}
}
public static void Test2(BufferedReader bufferedReader) throws IOException{
BufferedSemi buffln=new BufferedSemi(bufferedReader);
String line=null;
while((line=buffln.readLine())!=null){
System.out.println(line);
}
}
public static void Test3(BufferedReader bufferedReader) throws IOException{
bufferedLineNum buffln=new bufferedLineNum(bufferedReader);
BufferedSemi buffs=new BufferedSemi(buffln);
String line=null;
while((line=buffs.readLine())!=null){
System.out.println(line);
}
}
}
/**
* 装饰类给被装饰者BufferedReader添加带行号的输入字符流
* @author wo
*
*/
class bufferedLineNum extends BufferedReader{
//一个被装饰 类的引用
BufferedReader bufferedReader;
int count = 1;//计数器
public bufferedLineNum(BufferedReader bufferedReader){
super(bufferedReader);//没有意义只是为了不报错;
//继承父类(含有有参构造函数)是必须要在子类写有参构造函数
//不写就是无参构造函数,这里要直至父类无参构造函数但父类没有
this.bufferedReader=bufferedReader;
}
public String readLine() throws IOException{
String line=bufferedReader.readLine();
if(line==null){
return null;
}
line=count+":"+line;
count++;
return line;
}
}
/**
* 装饰类给被装饰者BufferedReader添加每行添加双引号
* @author wo
*
*/
class BufferedSemi extends BufferedReader{
BufferedReader bufferedReader;
public BufferedSemi(BufferedReader bufferedReader){
super(bufferedReader);//没有意义只是为了不报错;
//继承父类(含有有参构造函数)是必须要在子类写有参构造函数
//不写就是无参构造函数,这里要直至父类无参构造函数但父类没有
this.bufferedReader=bufferedReader;
}
public String readLine() throws IOException{
String line = bufferedReader.readLine(); //如果这里的ReadLine方法是调用了buffereLineNum的readLine方法,问题马上解决。
if(line==null){
return null;
}
line = """+line +""";
return line;
}
}