将序列化对象/数组写入和取出文件

想要将对象作为一个整体到文件中,java提供了相应的手段

1.对象定义为可序列化,即该类实现Serializable接口

package bean;

import java.io.Serializable;

public class FormatFilter implements Serializable{

	private String name;	//过滤器名字
	private String grammar;		//过滤器语法
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGrammar() {
		return grammar;
	}
	public void setGrammar(String grammar) {
		this.grammar = grammar;
	}
	
	
	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 * 重写toString,不然序列化之后显示的是内存地址
	 */
	@Override
	public String toString() {
		return name + " " + grammar;
	}
	
	
}

	

最后的toString()不知到是否有效;

2.文件操作中使用ObjectInputStream和ObjectOutputStream来实现文件的读写

public class FilterDeal {

	//单例模式
	private static FilterDeal fdeal = new FilterDeal();
	private List<FormatFilter> filters;
	private String filepath;
	private File file;
	private ObjectInputStream oin;
	private ObjectOutputStream oout;
	
	private FilterDeal() {
		filters = new LinkedList<FormatFilter>();
		filepath = "filter.txt";
		file = new File(filepath); 

	}
	
	public static FilterDeal newInstance() {
		return fdeal;
	}
	
	public List<FormatFilter> loadFilter() {
		//如果已经加载了文件中的数据,直接返回
		if(filters.size()>0) {
			return filters;
		}
		//读取文件中的数据
		try {
			oin = new ObjectInputStream(new FileInputStream(file));
			filters = (List<FormatFilter>) oin.readObject();
//			FormatFilter filter = null;
//			while((filter = (FormatFilter) oin.readObject())!=null) {
//				filters.add(filter);
//				filter = null;
//			}
			
			oin.close();
		} catch (IOException | ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
		return filters;
	}
	
	//添加一条新过滤规则
	public void addFilter(FormatFilter filter) {
		filters.add(filter);
		//将新过滤规则写入文件
		try {
			oout = new ObjectOutputStream(new FileOutputStream(file));
			oout.writeObject(filters);
			oout.close();
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
	}

我这边是直接将List<FilterDeal>存入了文件,直接存入FilterDeal也是类似的操作,因为本质上他们都是Object类型。

3.数组的存储

一般很多时候我们可能会存取多个对象,这时候只需要将这多个对象放入一个数组或是list等,然后如2中所操作的那样,将这个数组当作一个对象存入文件,取的时候也是整个数组一起去出

 

注:上述文件的写入会直接覆盖原文件信息,可将要添加的对象先加入数组再将数组写入文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值