文章目录
1 转换流
1.1编码和解码
编码:把字符流转化为字节流比如说“a”->97(0110 0001)
解码:把字节转化为字符,97->a
1.2字符集
一个系统支持所有的字符集合(文字,标点符号,图形符号)
1.3字符编码
字符编码:比如字符a对应的码值为97
1.4常见的字符编码
ASCII:ASCII编码:规定所有字符都占用一个字节
GBK:GBK编码,规定所有字符都占用两个字节
Unicode UTF-8编码,规定每个字符都占用三个字节
注意:IDEA默认使用UTF-8,windows默认使用GBK编码
使用InputStreamReader解决读取中问问题
InputStreamReader extends Reader
构造方法
public InputStreamReader(InputStream in,String charsetName);//指定使用何种编码读文件
public InputStreamReader(InputStream in);//使用工具默认的编码去读文件(IDEA默认UTF-8)
package com.itcast.Text02;
import java.io.*;
public class Demo03 {
public static void main(String[] args) throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("1.txt"), "UTF-8");
int read = inputStreamReader.read();
System.out.println(read);
inputStreamReader.close();
}
}
1.5使用OutputStreamWriter写不同的编码中文
OutputStreamWriter extends Writer
public OutputStreamWriter(OutputStream out,String charsetName);//写文件时指定编码
public OutputStreamWriter(OutputStream out);//使用工具默认的编码写文本(IDEA是UTF-8)
package com.itcast.Text02;
import java.io.*;
public class Demo04 {
public static void main(String[] args) throws IOException {
OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("1.txt"), "GBK");
gbk.write("你好,二哈");
gbk.close();
}
}
//GBK IDEA打开默认乱码,不乱码定义成UTF-8
文件转换编码:
package com.itcast.Text02;
import java.io.*;
public class Demo05 {
public static void main(String[] args) throws IOException {
InputStreamReader gbk = new InputStreamReader(new FileInputStream("1.txt"), "GBK");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("2.txt"), "UTF-8");
int len = 0;
while ((len = gbk.read()) != -1) {
writer.write(len);
}
writer.close();
gbk.close();
}
}
2.序列化流
2.1序列化流的介绍
序列化流:写出对象的流。ObjectOutputStream
反序列化流: 读取对象的流,OjectInputStream
2.2ObjectOutputStream的介绍和使用
需要实例化一个Java。io。Serializable接口
该接口没方法,一般称为标记接口
序列化操作
package com.itcast.Text02;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Demo06_Serializable {
public static void main(String[] args) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("1.txt"));
Dog dog = new Dog("旺财", "北京");
objectOutputStream.writeObject(dog);
objectOutputStream.close();
//保存的数据乱码
}
}
反序列化:
ObjectInputStream的介绍和使用
public ObjectInputStream(InputStream in);
反序列化的操作
package com.itcast.Text02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Dmeo07 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("1.txt"));
Dog object = (Dog) objectInputStream.readObject();
System.out.println(object);
objectInputStream.close();
}
}
反序列化的两种常见异常:
ClassNotFoundException没有找到异常类
出现原因:序列化之后,反序列化之前,删除原来的那个异常类
InvalidClassException无效异常
序列化之后,反序列化之前修改了那个类
package com.itcast.Text02;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo08 {
public static void main(String[] args) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("1.txt"));
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("旺财", "北极"));
dogs.add(new Dog("来福", "南极"));
dogs.add(new Dog("阿斗", "蜀国"));
dogs.add(new Dog("刘禅", "蜀国"));
objectOutputStream.writeObject(dogs);
objectOutputStream.close();
}
}
package com.itcast.Text02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
public class Demo09 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("1.txt"));
ArrayList<Dog> dogs = (ArrayList<Dog>) objectInputStream.readObject();
objectInputStream.close();
for (Dog dog : dogs) {
System.out.println(dog);
}
}
}
3.打印流
3.1打印流的介绍
1.打印流PrintStream
2.打印流中重写各种数据类型的print和println方法,打印数据时非常方便
3.打印流不会抛出IOException(会抛出别的Exception)
构造方法
public PrintStream(String path);
public PrintStream(File file);
public PrintStream(OutputStream out);
成员方法:
public void print(各种类型); //不带换行的打印
public void println(各种类型); //带换行的打印
public class PrintStreamDemo {
public static void main(String[] args) throws Exception {
PrintStream ps1 = new PrintStream("p.txt");
ps1.println('a');
ps1.println(97);
ps1.println(true);
ps1.println(100);
ps1.println("HelloWorld");
ps1.close();
}
}
4.装饰者设计模式
装饰模式的作用
装饰模式是在不改变元类,动态的扩展一个对象功能
装饰类与被装饰类必须实现同统一的接口
在装饰类中必须传入被装饰类的引用
在装饰类中需对扩展方法进行扩展
在装饰类中,不需要调用装饰类中的同名方法
案例:
package com.itcast.Text02;
public class Demo10 {
public static void main(String[] args) {
Liudehua l = new Liudehua();
LiudehuaWrapper liudehuaWrapper = new LiudehuaWrapper(l);
liudehuaWrapper.sing();
liudehuaWrapper.dace();
}
interface SingStar {
void sing();
void dace();
}
private static class Liudehua implements SingStar {
@Override
public void sing() {
System.out.println("啊哈,给我一杯忘情水");
}
@Override
public void dace() {
System.out.println("蹦砂卡拉卡");
}
}
//装饰类
static class LiudehuaWrapper implements SingStar {
private Liudehua ldh;
public LiudehuaWrapper(Liudehua ldh) {
this.ldh = ldh;
}
@Override
public void sing() {
System.out.println("刘德华在北京鸟巢跳舞");
ldh.sing();
}
@Override
public void dace() {
System.out.println("刘德华在北京西单跳舞");
ldh.dace();
}
}
}