2021-04-13

处理流之六:对象流

ObjectInputStream和OjbectOutputSteam
用于存储和读取对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从据源中还原回来。
序列化与反序列化对针对的是对象的各种属性,不包括类的属性
序列化(Serialize):用ObjectOutputStream 类将一个Java对 象写入I0流中
反序列化(Deserialize):用ObjectlnputStream类 从I0流中恢复该Java对象
ObjectOutputStream和ObjectlnputStream不能序列化static和transient修饰的成员变量
//正是因为保存对象到硬盘(对象的持久化)和对象的网络传输,需要做这两件事就产生了对象的输入与输出流

RandomAccessFile类

RandomAccessFile类支持“随机访问”的方式,程序可以直接跳到文件的任意地方来读、写文件
支持只访问文件的部分内容
可以向已存在的文件后追加内容
RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。
RandomAccessFile类对象可以自由移动记录指针:
**long getFilePointer()😗*获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到pos位置

下面做文件的序列化与反序列化
首先创建一个Person类

import java.io.Serializable;

public class Person implements Serializable{
	
	/*
	 * 一个表示序列化版本标识符的静态变量
	 * 用来表明类的不同版本间的兼容性
	 */
	private static final long serialVeersionUID = 1L;
	
	
	String name;
	int age;
}

对象的序列化

/*
	 * 对象的序列化
	 */
	public static void testSerialize() throws Exception {
		//定义对象的输出流,把对象的序列化之后的流放到指定的文件中
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\\\eclipse  Java\\\\Ti\\\\src\\\\day13\\\\tt9.txt"));
	
		Person p = new Person();
		p.name = "zhangsan";
		p.age = 11;
		
		out.writeObject(p);
		out.flush();//刷写数据到硬盘
		
		out.close();
	}

对象的反序列化

/*
	 * 对象的反序列化
	 */
	public static void testDeserialize() throws Exception {
		//创建对象输入流对象,从指定的文件中把对象的序列化之后的流读取出来
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\\\\\\\eclipse  Java\\\\\\\\Ti\\\\\\\\src\\\\\\\\day13\\\\\\\\tt9.txt"));

		Object obj = in.readObject();
		
		Person p = (Person)obj;
		/*
		 * 对象的序列化与反序列化使用的类要严格一致,包名类名类机构等等都要一致
		 * 否则出现错误
		 */
//		day13.test.Person p = (day13.test.Person)obj;
		
		System.out.println(p.name);
		System.out.println(p.age);
	}

文件的随机读写,程序可以跳到文件的任意位置来读写文件

文件的随机读

public static void testRandomAccessFileRead() throws Exception{
		//RandomAccessFile的构造有两个参数,参数1是读写文件的路径
		//参数2是指定RandomAccessFile 的访问模式
		//r: 只读
		//rw: 读取和写入
		//rwd: 读取和写入,同步文件的的更新
		//rws: 读取和写入 同步文件内容和元数据的更新
		//最常使用r和rw
		
		RandomAccessFile ra = new RandomAccessFile("D:\\eclipse  Java\\Ti\\src\\day13\\test10.txt","r");
		ra.seek(0); // 设置读取文件内容的起始点
		
		byte[] b = new byte[1024];
		int len = 0;
		while((len = ra.read(b)) != -1) {
			System.out.println(new String(b, 0, len));
		}
		ra.close();
	}

文件的随机写

	public static void testRandomAccessFileWrite() throws Exception{
		RandomAccessFile ra= new RandomAccessFile("D:\\eclipse  Java\\Ti\\src\\day13\\test10.txt","rw");
		ra.seek(0); //设置写文件内容的起始点
		//写入的文件会将原来的文件覆盖
//		ra.seek(ra.length()); // 追加文件设置起始点为ra.length()
		ra.write("你好".getBytes());
		
		ra.close();
	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值