Java学习第二十一天知识点(对象流、异常)
对象流:
1.父类:InputStream/OutputStream
2.序列化
1).对象 -> 文件[字节]
2).Serializable - 接口
a.接口中没有常量,也没有抽象方法,是个空接口
b.作用:用于标记是可序列化的
3)关键词:
a.serialVersionUID: 给类添加固定的序列版本号
①.变量必须是long类型修饰
②.必须是public static final修饰
③.序列化后的版本编号,不指定的话,会自动生成一串新的序列号,是随着类的内容改变而改变
b.transient:
①.用于修饰变量,在序列化的时候,值会被忽略
②.使用场景:在传输的过程中,不想别人看到的属性值就是用transient
反序列化
文件[字节] -> 对象
3.子类/实现类:
1).ObjectInputStream
(1)创建:
new ObjectInputStream(底层字节流)
(2)常用API:
Object readObject()
2).ObjectOutputStream
(1)创建
new ObjectOutputStream(底层字节流)
(2)常用API:
void writeObject(Object obj)
RandomAccessFile - 文件的[随机]访问
1.随机:操作文件的位置 -> pointer
1.获取当前指针位置
2.跳过对应的字节数 -> 顺序
3.跳转到指定的指针位置
2.特点:
a.基于文件指针的操作,是一个可读可写的类
b.文件指针停留在哪儿,就可以操作文件的那个位置
c.也可以手动指定文件指针的位置
3.创建:
new RandomAccessFile("文件路径","模式")
模式:
r - 读
w - 写
rw - 可读可写
4.指针位置的操作:
void skipBytes(跳过字节个数)
long getFilePointer() - 获取当前指针位置
void seek() - 定位到文件指定的位置
5.读写特定字节:
readInt()/readLong()
writeInt()/writeLong()
文件流代码:
import org.junit.Test;
import java.io.*;
public class Demo01 {
@Test
public void add() throws IOException, ClassNotFoundException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
Student s=new Student("张三",18);
s.age2=18;
oos.writeObject(s);
Student s1=(Student)ois.readObject();
System.out.println(s1);
}
}
Student类:
import java.io.Serializable;
public class Student implements Serializable {
public static final long serialVersionUID=123l;
private String name;
private transient int age;//加上transient后隐藏
public int age2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", age2=" + age2 +
'}';
}
}
___
异常:
java.lang包
Throwable ->所有异常的父类
|- Error(错误)
|- 栈溢出: StackOverflowError
原因:内存泄漏,短时间创建了大量的无用对象
|- Exception(异常)
|- 运行时异常
|- NullPointerException - 空指针异常
|- IndexOutOfBoundException - 下标越界异常
|- ClassCastException - 类型转换异常
|- NumberFormatException - 数值转换异常
|- IllegalArgumentException - 非法的参数
|- UnsupportedOpertionException - 不支持的操作
|- 已检查异常(非运行时异常/编译时异常)
|- parseException - 格式化异常
|- IOException - IO异常
|- FileNotFoundException - 文件未找到
|- ClassNotFoundException - 类未找到
|- UnsupportedEncodingException - 不支持的字符集异常
解决异常的方式:
1.try-catch:捕抓异常【自己能解决的异常】
注意事项:
a.可能出现异常的代码,必须写在try中
b.要捕获的异常类型,必须符合可能出现异常类型
c.try代码块中的代码出现异常,能被捕获,程序不会终止
d.一个try后面可以跟多个catch捕抓的不同的异常
多个catch一定是父类型异常放在子类型异常的后面.
如果是多个没有关系的异常之间没有顺序
e.catch中定义的是父类型异常,那么可以将父类中所有的子类型一起捕获
f.try-catch可以嵌套使用,但是没有必须
g.try 后面 必须至少要有一个catch,可以有一个finally,如果有,就一定会执行finally中内容
h.finally的作用: 用来做扫尾工作,比如说用来释放资源
2.throws:抛出异常【向上抛出异常】
异常测试代码:
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String s="2000-02-14";
try {
Date s1 = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
try{
String[] str=new String[3];
//System.out.println(str[1].length());
int[] in={1,2,3};
//System.out.println(in[3]);
Object strSecond=new String("a");
Integer integer=(Integer)strSecond;
}catch(NullPointerException e){
System.out.println("空指针异常!");
}
catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界异常!");
}
catch (ClassCastException e){
System.out.println("类型转化异常!");
}
catch (RuntimeException e){
System.out.println("异常已抛出!");
}
}