想要将对象作为一个整体到文件中,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中所操作的那样,将这个数组当作一个对象存入文件,取的时候也是整个数组一起去出
注:上述文件的写入会直接覆盖原文件信息,可将要添加的对象先加入数组再将数组写入文件