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. transient修饰的变量,不能被序列化
  2. static修饰的变量,不能被序列化
发布了70 篇原创文章 · 获赞 3 · 访问量 1245

猜你喜欢

转载自blog.csdn.net/qq_43361209/article/details/103425635