转换流
可以指定编码读写,但是jdk 11版本以后,就不需要用转换流了。字符流自带置顶编码读写
对象操作流
可以把对象以字节的形式写到本地文件。如果是读不懂的,需要再次用对象操作流读到内存中
对象操作输入流(对象反序列化流) ObjectInputStream (new字节流对象)
对象操作输出流(对象序列化流)ObjectOutputStream(new字节流对象)
但是如果想要某个类的对象能被序列化,那么这个类必须要实现一个接口 Serializable
Serializable 是一个标记性接口,里面没有任何方法,只是实现了就代表这个类可以被序列化
对象操作输出流:对象序列化
public static void main(String[] args) throws IOException { User user =new User("zhangsan","zhang123"); //创建对象操作输出流对象 ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream("test\\.a.txt")); //这里的写 是写对象的 所以是writeObject oos.writeObject(user); oos.close(); }
对象操作输入流:对象反序列化
public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream ois =new ObjectInputStream(new FileInputStream("test\\.a.txt")); //这里返回的 类型是Object的 但是我们需要User类 所以需要做强转 User user = (User)ois.readObject(); System.out.println(user); ois.close(); }
问题:
当对象序列化流序列化了一个对象后,如果我们修改了对象所属的javaBean类,读取数据会出问题,并抛出InvalidClassException异常
虚拟机 会自动计算出我们类的一个序列号,如果修改javabean 那么 序列号发生改变 就没法对应类了
这时候我们可以手动设定序列号:
private static final long serialVersionUID= 42l; //设定的号只要不超过long的范围就行
如果太长记不住,可以去ArrayList类看 然后复制就行了
如果我们某个变量的值不想被序列化呢?
直接类定义成员变量的时候用 transient 关键字修饰
如:private transient String password;
如果要读写多个对象,我们直接创建一个集合 这样读跟写 都只需要一次
Properties
properties 是一个map类型的集合类 他没有固定的泛型
properties 中有跟IO相关的方法
我们用的时候只存字符串
特有方法
Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |
String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
Set<String> stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
这三个分别对应map 自有的 put get 跟keySet方法
和IO流结合的方法
void load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对) |
void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
void store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |
void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
如果要写properties的数据 只要写 键=值 就可以了
如 username = "zhangsan"
password = "zhang123"
store 例子:
public static void main(String[] args) throws IOException, ClassNotFoundException { //创建字符输出流 FileWriter fw =new FileWriter("test\\prop.properties"); Properties prop = new Properties(); prop.put("zhangsan","123"); prop.put("lisi","456"); prop.put("wangwu","789"); //将键值对 prop.store(fw,null); }
load 例子:
public static void main(String[] args) throws IOException, ClassNotFoundException { FileReader fl =new FileReader("test\\prop.properties"); Properties prop = new Properties(); prop.load(fl); System.out.println(prop); }