JavaWeb—IO(3)

1.IO中的缓冲/缓存

缓存(cache)——为主
缓冲(buffer)——读写都有可能(多用在IO层面)

flush操作的策略

 读没有flush 写有flush
 1.行缓冲: \n自动flush
 2.块缓冲:  4K自动flush
 3.定时缓冲: 1s自动flush

注意

不是每次read都会从硬盘读,不是每次write都写回硬盘

2.IO设备都是有开就有关

流:close(); //close里隐含着flush操作

2.1try with resource操作

语句:
在这里插入图片描述
eg:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class TryWithResource {
    public static void main(String[] args) {
        try (InputStream is = new FileInputStream("你好")) {
            //代码
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // is会自动close   不用自己close 
    }
}

3.流:四个接口

InputStream/OutputStream              字节流(二进制形式的数据)
Read/Writer                           字节流(文本)
BufferedReader/BufferedWrite相关的     缓冲相关的

在这里插入图片描述

4.相对路径_getResource()

public class OpenUseClass {
    public static void main(String[] args) {
    //两种方式打开文件 都是相对路径 但不是相对于同一个文件的相对路径
        
        OpenUseClass.class.getResource("xxx.txt");
        //1.OpenUseClass.class 所在路径的相对路径
        //2.即相对于类所在的路径开始找
       
        OpenUseClass.class.getClassLoader().getResource("xxx.txt");
        //相对于当前包的根路径开始找
    }
}
  1. 方式一: OpenUseClass.class.getResource(“xxx.txt”);
  2. 方式二:OpenUseClass.class.getClassLoader().getResource(“xxx.txt”);
    在这里插入图片描述

5.序列化与反序列化

5.1什么是序列化和反序列化

序列化(Serialize):把对象转换为字节序列的过程称为对象的序列化(内存中的对象经过流,输出到指定的输出设备上)

反序列化(Deserialize):把字节序列恢复为对象的过程称为对象的反序列化(从指定的输入设备,按照输入流,读到内存中并组织成对象的过程)

5.2什么时候需要序列化

  1. 把内存中的对象状态保存到一个文件中或者数据库中时候;
  2. 用套接字在网络上传送对象的时候;

5.3实现序列化本身与语言无关

5.4Java对象序列化

java中原生支持的一种二进制序列化格式 —— Interface Serailizable

import java.io.*;

public class SDPerson {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person对象.obj"));
        Person person = (Person)ois.readObject();
        System.out.println(person);
        ois.close();

        /*
        Person person = new Person();
        person.name = "李明";
        person.age = 14;
        person.sex = "男";
        person.sn = 110;

        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("person对象.obj")
        );

        oos.writeObject(person);//序列化 对象--》字节
        oos.close();
        */
    }
}

反序列化结果:
反序列化结果
相关流说明:
     ObjectOutputStream代表对象输出流: 它的 writeObject(Object obj) 方法可对参数指定的 obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
     ObjectInputStream 代表对象输入流:它的 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

注意

  1. 一个类如果想被序列化,那么需要实现一个Serializable接口。
  2. 类中的静态变量的值是不会被进行序列化的transient 修饰的属性,是不会被序列化的,内置类型为对应0值,引用类型为null。
  3. 在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值,最好设置为1L,这个L最好大写来区分,不然小写看起来像是1,不同的 serialVersionUID 的值,会影响到反序列化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值