利用集合和文件的系列,反系列化模拟实现数据的存储功能

package com.manage.tset;

import java.io.File;
import java.util.ArrayList;

public interface IManageNewsInfo {

//显示所有的新闻的信息的方法
ArrayList<NewsInfo> showAllNews() throws Exception;

//实现添加新闻的方法
void addNews(NewsInfo news) throws Exception;

//删除新闻的方法
boolean deleteNews(int newsId) throws Exception;

}

////////////////////////////////////////接口//////////////////////////////////////////////

package com.manage.tset;

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

public class NewsInfo implements Serializable{
private Integer newsId;//新闻编号
private String newsTitle;//新闻标题
private String newsContent;//新闻内容
private String newsDate;//发布时间

//获得getXxx和setXxx方法
public Integer getNewsId() {
return newsId;
}
public void setNewsId(Integer newsId) {
this.newsId = newsId;
}
public String getNewsTitle() {
return newsTitle;
}
public void setNewsTitle(String newsTitle) {
this.newsTitle = newsTitle;
}
public String getNewsContent() {
return newsContent;
}
public void setNewsContent(String newsContent) {
this.newsContent = newsContent;
}
public String getNewsDate() {
return newsDate;
}
public void setNewsDate(String newsDate) {
this.newsDate = newsDate;
}
public NewsInfo(Integer newsId, String newsTitle, String newsContent,
String newsDate) {

this.newsId = newsId;
this.newsTitle = newsTitle;
this.newsContent = newsContent;
this.newsDate = newsDate;
}
@Override
public String toString() {
return "NewsInfo [newsId=" + newsId + ", newsTitle=" + newsTitle
+ ", newsContent=" + newsContent + ", newsDate=" + newsDate
+ "]";
}
}

/////////////////////////////实现接口类///////////////////////////////////////////////////////////////

package com.manage.tset;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/*
* 业务管理类
* 1.主要是实现接口中的方法
* 2.管理业务实现
* 3.要把集合的对象系列化到文件中,再通过反系列化从文件中取出来
* */
public class MamageNewsInfo implements IManageNewsInfo{
static File newsFile = new File("E:\manage\news.txt");
ArrayList<NewsInfo> list = new ArrayList<NewsInfo>();//定义一个集合
static{
/*
* 静态代码块主要用于类的初始化。它只执行一次,并在main函数之前执行。
静态代码块的特点主要有:
静态代码块会在类被加载时自动执行。
静态代码块只能定义在类里面,不能定义在方法里面。
静态代码块里的变量都是局部变量,只在块内有效。
一个类中可以定义多个静态代码块,按顺序执行。
静态代码块只能访问类的静态成员,而不允许访问实例成员。
* */
//创建文件,在这里要用static括起来,否则会出错,因为还没有在内存中分配内存就开始用就会报错
File file = new File("E:\manage");
if(!file.exists()){//判断文件是否存在,不存在则创建
file.mkdirs();
}
// newsFile = new File("E:\manage\news.txt");
if(!newsFile.exists()){//判断文件是否存在,不存在则创建
try {
newsFile.createNewFile();
//当没有文件的时候,把空的集合系列化到文件中去,在反系列化出来,只加载一次,当有文件存在的时候,不再又把空的系列化到文件中去了
new MamageNewsInfo().reserializable(newsFile,new MamageNewsInfo().list);//系列化一个空的集合到文件中去
//ArrayList list = new MamageNewsInfo().deserializable(newsFile);//反系列化集合
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// try {
// new MamageNewsInfo().reserializable(newsFile,new MamageNewsInfo().list);
// ArrayList list = new MamageNewsInfo().deserializable(newsFile);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }//调用系列化的方法
}
//定义一个集合

//NewsInfo news = new NewsInfo();
/* (non-Javadoc)
* @see com.manage.tset.IManageNewsInfo#showAllNews()
*/
//显示所有的新闻的信息的方法
public ArrayList<NewsInfo> showAllNews() throws Exception{
/**
//创建一个输出低级流
OutputStream os = new FileOutputStream("E:\manage\news.txt");
//创建一个系列化输出流,把一个空集合系列化
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(list);
*/
//reserializable(newsFile,list);//调用系列化的方法
/**
//定义一个输入低级流
InputStream is = new FileInputStream("E:\manage\news.txt");
//创建一个反系列输入流,反系列文件中的集合对象
ObjectInputStream ois = new ObjectInputStream(is);
//把文件中的内容反系列出来,并且强制转换为NewsInfo对象
ArrayList<NewsInfo> list =( ArrayList<NewsInfo>) ois.readObject();
*/
ArrayList<NewsInfo> list = deserializable(newsFile);//调用反系列化的方法,并且返回一个ArrayList类型的集合
if(!list.isEmpty()){
// for (NewsInfo news : list) {
// System.out.println(news.getNewsId()+" "+news.getNewsTitle()+" "+news.getNewsContent()+" "+news.getNewsDate());
// }
reserializable(newsFile,list);//调用系列化的方法
return list;


}else{
//System.out.println("现在还没有任何新闻信息");
return null;
}

}

//实现添加新闻的方法
/* (non-Javadoc)
* @see com.manage.tset.IManageNewsInfo#addNews(com.manage.tset.NewsInfo, java.io.File)
*/
/**添加新闻,
* 1.首先先把调用反系列化的方法,把集合反系列化出来,
* 2.再把对象添加到集合中,
* 3.在通过系列化把集合系列化到文件中
* 注:反系列化出来是为了不让后面的内容覆盖前面的内容
* @throws Exception
*/
public void addNews(NewsInfo news) throws Exception{
ArrayList<NewsInfo> li = deserializable(newsFile);//把集合反系列化出来,
li.add(news);
//System.out.println(li);测试是否把对象添加到集合中
reserializable(newsFile,li);//调用系列化的方法,再把集合系列化到文件中去
/*
* 反系列化出来看集合是否存入到了文件中,
ArrayList<NewsInfo> list = deserializable(newsFile);

for (NewsInfo j :list) {
System.out.println(news.getNewsId()+" "+news.getNewsTitle()+" "+news.getNewsContent()+" "+news.getNewsDate());
}
*/
}

//删除新闻的方法
/* (non-Javadoc)
* @see com.manage.tset.IManageNewsInfo#deleteNews(int)
*
* 1.通过反系列化,把集合拿出来
* 2.通过循环比较,看是否有和该新闻编号相同的新闻
* 3,如何有,则删除,没有则输出没有找到
*/
public boolean deleteNews(int newsId) throws Exception{
//boolean flag=false;
ArrayList<NewsInfo> li = deserializable(newsFile);//把集合反系列化出来,并且用一个ArrayList接收
if(!li.isEmpty()){
for (NewsInfo lt :li) {
if(lt.getNewsId().intValue()==newsId){//如果集合中存在和输入的编号相等,则删除
li.remove(lt);
//再把集合系列化到文件中
reserializable(newsFile,li);//调用系列化的方法,再把集合系列化到文件中去
//flag = true;
return true;
}
}
}
//else{
//System.out.println("还没有你要删除的新闻信息");
//return false;
//}
return false;
}

//定义一个系列化的方法
private void reserializable(File file ,ArrayList<NewsInfo> list) throws Exception{

//创建一个输出低级流
OutputStream os = new FileOutputStream(file);
//创建一个系列化输出流,把一个空集合系列化
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(list);
oos.flush();
oos.close();
}

//定义一个反系列化方法
private ArrayList<NewsInfo> deserializable(File file) throws Exception{
//定义一个输入低级流
InputStream is = new FileInputStream(file);
//创建一个反系列输入流,反系列文件中的集合对象
ObjectInputStream ois = new ObjectInputStream(is);
//把文件中的内容反系列出来,并且强制转换为NewsInfo对象
ArrayList<NewsInfo> list =( ArrayList<NewsInfo>) ois.readObject();
ois.close();
return list;
}
}

///////////////////////////////业务实现类///////////////////////////////////////////

package com.manage.tset;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

/*
* 测试新闻管理系统类
* */
public class NewsInfoTest {
public static void main(String[] args) {
MamageNewsInfo mio = new MamageNewsInfo();
NewsInfo nif ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//创建一个扫描器
Scanner sc = new Scanner(System.in);
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<欢迎使用新闻管理系统终极版>>>>>>>>>>>>>>>>>>>>>>>");
while(true){
System.out.println("1.查询新闻");
System.out.println("2.添加新闻");
System.out.println("3.删除新闻");
System.out.println("0.退出系统");
System.out.println("请选择功能(1,2,3,0)");
int number = sc.nextInt();
System.out.println("新闻内容如下:");
System.out.println("==========================================================");
System.out.println("编号"+" 标题"+" 内容"+" 时间");
switch(number){
case 1:

try {
ArrayList<NewsInfo> list = mio.showAllNews();
if( list != null){
for (NewsInfo news : list) {
System.out.println(news.getNewsId()+" "+news.getNewsTitle()+" "+news.getNewsContent()+" "+news.getNewsDate());
}
}else{
System.out.println("现在还没有任何新闻信息");
}
} catch (Exception e) {
//由于这里是main方法里,属于最高层,在这里出现异常只能出来,不能抛throws
System.out.println("查询新闻失败!!!");
e.printStackTrace();
}
break;
case 2:
// NewsInfo news = new NewsInfo();
System.out.println("请输入新闻编号:");
Integer newsId = sc.nextInt();
sc.nextLine();
System.out.println("请输入新闻标题:");
String newsTitle = sc.nextLine();
System.out.println("请输入新闻内容:");
String newsContent = sc.nextLine();
//System.out.println("请输入新闻发布时间");
// String date = sc.nextLine();
Date date = new Date();
nif= new NewsInfo(newsId,newsTitle,newsContent,sdf.format(date));
try {
mio.addNews(nif);
System.out.println("添加成功!!!");
} catch (Exception e) {
System.out.println("添加失败!!!");
e.printStackTrace();
}
break;
case 3:
System.out.println("请输入你要删除的编号:");
Integer newsNumber = sc.nextInt();

try {
boolean flag = mio.deleteNews(newsNumber);
if(flag){
System.out.println("删除成功!!!");
}else{
System.out.println("删除失败!!!");
}

} catch (Exception e) {
System.out.println("删除时出现异常,失败!!!");
e.printStackTrace();
}
break;
case 0://退出系统
System.out.println("谢谢使用本新闻管理系统,欢迎下次光临!!!");
sc.close();
System.exit(0);
break;
}
System.out.println("==========================================================");
}
}
}

////////////////////////////////////测试类/////////////////////////////////////////////

原文地址:https://www.cnblogs.com/wanglu1991/p/4584211.html