Java学习第二十一天

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("异常已抛出!");
       }

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值