目录
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");
//相对于当前包的根路径开始找
}
}
- 方式一: OpenUseClass.class.getResource(“xxx.txt”);
- 方式二:OpenUseClass.class.getClassLoader().getResource(“xxx.txt”);
5.序列化与反序列化
5.1什么是序列化和反序列化
序列化(Serialize):把对象转换为字节序列的过程称为对象的序列化(内存中的对象经过流,输出到指定的输出设备上)
反序列化(Deserialize):把字节序列恢复为对象的过程称为对象的反序列化(从指定的输入设备,按照输入流,读到内存中并组织成对象的过程)
5.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() 方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
注意
- transient修饰的变量,不能被序列化
- static修饰的变量,不能被序列化