zoukankan      html  css  js  c++  java
  • 利用集合和文件的系列,反系列化模拟实现数据的存储功能

    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("==========================================================");
    }
    }
    }

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

  • 相关阅读:
    【Azure 应用服务】由 Azure Functions runtime is unreachable 的错误消息推导出 ASYNC(异步)和 SYNC(同步)混用而引起ThreadPool耗尽问题
    【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
    【Azure 应用服务】Azure Function 不能被触发
    【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
    【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
    【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达
    【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)
    【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
    【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
    【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
  • 原文地址:https://www.cnblogs.com/wanglu1991/p/4584211.html
Copyright © 2011-2022 走看看