关于IO流的分类及对象序列化与反序列化操作

IO流的分类汇总

1> 按照流向划分:

输入流(InputStream) : 通过程序只能从流中读取字节或者字符数据

输出流(OutputStream) : 通过程序只能从流中向外输出字节或字符数据


2> 按照处理数据类型划分:

字节流(byte) : 8bits;处理字节数据(如音频,视频,图片等二进制文件)

字符流(char) : 16bits;处理Unicode(字符)数据(如纯文本文件,字符串信息)


3> 按照级别划分:

节点流 :直接跟输入输出源沟通的流,如FileInputStream,FileOutputStream, FileReader, FileWriter…

处理流 :对其他流进行包装处理,如转换流, 缓冲流

转换流 : 字节流<<<------>>>字符流, 如InputStreamReader,OutputStreamWriter

缓冲流 : 如BufferedInputStream,BufferedOutputStream, BufferedReader, BufferedWriter

随机访问流: RandomAccessFile类


对象的序列化与反序列化

对象的序列化:

就是将一个java对象存储到文件,网络等其他的存储介质中;一个java类实现序列化接口之后,可以将对象的信息完整的保存到文件或者网络中进行传递

实现序列化的两种方法:

1> implements Serializable,通过对象输出流将java对象写入文件ObjectInputStream,ObjectOutputStream

2> implements Externalizable , 重写writeObject()以及readObject()方法以精确的控制哪些属性需要被序列化和被读取

package com.softeem.seri;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

//序列号,在进行对象反序列化时判断并识别被反序列化对象是否是原对象
public class TestGame {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		Player p = new Player("一二", 100, 20, new Date());
		// 对象序列化将一个java对象存储到文件,网络,远程服务器
		File file = new File("src\\com\\softeem\\homework\\a.txt");
		// 完成对象序列化
		FileOutputStream fos = new FileOutputStream(file);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(p);
		oos.close();
		// 对象反序列化
		FileInputStream fis = new FileInputStream(file);
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object obj = ois.readObject();
		p = (Player)obj;
		System.out.println(p);
	}
}



package com.softeem.seri;

import java.io.Serializable;
import java.util.Date;

public class Player implements Serializable{

	/**
	 * 序列号:在进行对象反序列化时判断并识别被反序列化对象是否是原对象
	 */
	private static final long serialVersionUID = 77545326076324329L;
	
	private String nickName;
	private int blood;
	private int level;
	private Date exitTime;
	// 加上transient 瞬时态 不会被序列化
	// 加上static 静态 不会被序列化 
	
	public Player() {
		// TODO Auto-generated constructor stub
	}
	public Player(String nickName, int blood, int level, Date exitTime) {
		super();
		this.nickName = nickName;
		this.blood = blood;
		this.level = level;
		this.exitTime = exitTime;
	}
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	public int getBlood() {
		return blood;
	}
	public void setBlood(int blood) {
		this.blood = blood;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
package com.softeem.io.seri;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class User implements Externalizable{

	private int uid;
	private String username;
	private String password; // 使用transient 关键字(瞬时态)不被序列化
	
	public User() {
		// TODO Auto-generated constructor stub
	}

	public User(int uid, String username, String password) {
		super();
		this.uid = uid;
		this.username = username;
		this.password = password;
	}

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [uid=" + uid + ", username=" + username + ", password=" + password + "]";
	}

	/**
	 * 通过实现该方法可以完成对指定属性值的序列化操作
	 */
	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		out.writeInt(uid);
		out.writeUTF(username);
		out.writeUTF(password);
	}

	/**
	 * 通过实现该方法可以完成对指定属性值的反序列化操作
	 */
	@Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
		uid = in.readInt();
		username = in.readUTF();
		password = in.readUTF();
		
	}
}


package com.softeem.io.seri;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {

	public static void main(String[] args) throws IOException, ClassNotFoundException {

		User user = new User(1,"admin","123456");
		File file = new File("src/userinfo");
		FileOutputStream fos = new FileOutputStream(file);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(user);
		
		FileInputStream fis = new FileInputStream(file);
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object obj = ois.readObject();
		System.out.println(obj);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值