【Java编程】图书管理系统

图书管理系统

我们用一个列表存放书籍信息。

private static List<Book> LIST = new ArrayList<>();

基本的 增、删、改、查 功能。

public static void main(String[] args) {
        readData();
        Scanner scanner = new Scanner(System.in);
        while(true) {
            System.out.println("================ 图书管理系统 ================");
            System.out.println("1.插入信息");
            System.out.println("2.修改信息");
            System.out.println("3.查询图书列表");
            System.out.println("4.删除图书");
            System.out.println("(按任意键退出系统)");
            String str = scanner.nextLine();
            switch (str){
                case "1":
                    insertBook(scanner);
                    break;
                case "2":
                    modifyBook(scanner);
                    break;
                case "3":
                    showBooks();
                    break;
                case "4":
                    deleteBook(scanner);
                    break;
                default:
                    saveData();
                    scanner.close();
                    return;
            }
        }
    }

一本图书包含:图书名称、作者名、价格。下面这种构造函数的写法是为了后面能够更方便地使用链式写法。

private static class Book implements Serializable{
        String name;
        String author;
        transient double price;

        public Book name(String name){
            this.name = name;
            return this;
        }

        public Book author(String author){
            this.author = author;
            return this;
        }

        public Book price(double price){
            this.price = price;
            return this;
        }

        @Override
        public String toString() {
            return "书籍{" +
                    "名称='" + name + '\'' +
                    ", 作者='" + author + '\'' +
                    ", 价格=" + price +
                    '}';
        }
    }

implements Serializable 的目的是在网络传输过程中将类对象转换为字符序列,这些字符序列可以用来重建对象。

  • 持久存储,将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本。
  • 按值封送,尤其是在分布式系统中。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。

如果用 transient 声明一个实例变量,当对象存储时它的值不需要维持,换句话来说就是,用 transient 关键字标记的成员变量不参与序列化过程。transient 关键字只能修饰变量,而不能修饰方法和类。

  • transient 是 Java 语言的关键字,用来表示一个成员变量不是该对象序列化的一部分,当一个对象被序列化的时候,transient 型变量的值不包括在序列化的结果中,而非 transient 型的变量是被包括进去的,注意 static 修饰的静态变量天然就是不可序列化的。
  • 一旦变量被 transient 修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法被访问,本地变量是不能被 transient 关键字修饰的,变量如果是用户自定义类变量,则该类需要实现 Serializable 接口。

添加书籍

private static void insertBook(Scanner scanner){
        Book book = new Book()
                .name(scanner.nextLine())
                .author(scanner.nextLine())
                .price(scanner.nextDouble());
        LIST.add(book);
        scanner.nextLine();
    }

删除书籍

private static void deleteBook(Scanner scanner){
        int i = 0;
        for (Book book: LIST){
            System.out.println(i + "." + book);
        }
        int index = scanner.nextInt();
        if (index >= LIST.size())
            System.out.println("错误的序号");
        else
            LIST.remove(i);
        scanner.nextLine();
    }

查看书籍

private static void showBooks(){
        LIST.forEach(System.out::println);
    }

修改书籍

private static void modifyBook(Scanner scanner){
        int i = 0;
        for(Book book: LIST) System.out.println(i+"."+book);
        int index = scanner.nextInt();
        scanner.nextLine();
        if(index >= LIST.size())
            System.out.println("错误的序号");
        else {
            LIST
                    .get(index)
                    .name(scanner.nextLine())
                    .author(scanner.nextLine())
                    .price(scanner.nextDouble());
        }
        scanner.nextLine();
    }

持久化(读)

@SuppressWarnings("unchecked")
private static void readData(){
    File file = new File("data");
    if(file.exists()) {
        try(ObjectInputStream inputStream = new ObjectInputStream((new FileInputStream("data")))){
            LIST = (List<Book>) inputStream.readObject();
        } catch(IOException | ClassNotFoundException e){
            e.printStackTrace();
        }
    } else{
        LIST = new ArrayList<>();
    }
}

持久化(存)

private static void saveData(){
    try(ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("data"))){
        outputStream.writeObject(LIST);
        outputStream.flush();
    } catch(IOException e){
        e.printStackTrace();
    }
}

持久化后,直接可以读取到存在 data 中的数据。

在这里插入图片描述


完整代码已放在 我的GitHub,需要可自取。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计要求: 1. 设计实现一个出版物的输入输出系统,出版物包括书,CD和磁带,用户选择对某一个出版物输入相关信息,并将输入的信息显示。 2. 各类出版物信息包括名字,作者或演唱者,出版社或唱片社,价格,出版日期等相关信息。 3. 使用循环来完成,以接受用户的循环操作。 4. 对于不合要求的输入,给出提示,允许再重新输入。 5. 当用户选择退出时,程序结束。 设计思路: 设计书,CD,磁带三个类,每个类含有名字,作者或演唱者,出版社或唱片社,价格,出版日期等相关信息。 由于这三个类又相关的相同内容,故可设计一个含有公共信息的父类。 class MyMedia{ String mediaName; //出版物名称 float price; //出版物价格 String press; //出版社(磁带发行商) String artist; //作者(演唱者) void mediaNameInput() //出版物名称输入 void mediaPriceInput(){ //出版物价格输入 void mediaPressInput(){ //出版社(磁带发行商)输入 void artistInput(){ //作者或演唱者输入 然后分别定义书,CD,磁带三个子类,并在各个子类中添加新的成员变量。 class MyBook extends MyMedia{ //书子类 String editor; //书的编辑 Date publishDate=null; //出版日期 String bookISBN; //书的ISBN } class MyCD extends MyMedia{ //CD子类 String cdISRC; //CD的ISRC String cdPublisher; //CD的发行商 } class MyTape extends MyMedia{ //磁带子类 String tapeISRC; } 相应改变各个子类中的成员函数。 主程序中用下述语句输出选项供用户选择: System.out.println("\n请选择你要进行的操作(请输入1-4中人一个数字):\n" +"1:输入书的信息;\n" +"2:输入CD的信息;\n" +"3:输入磁带的信息;\n" +"4:退出系统;\n"); 用户输入的值保存于变量choice中,程序根据它的值分情况处理: switch(choice){ case 1: //选择为书 //要求输入书的名称,价格等信息的输入相关信息,然后程序输出这些信息 break; case 2: //选择为CD //要求输入CD的名称,价格等信息的输入相关信息,然后程序输出这些信息 break; case 3: //选择为磁带 //要求输入磁带的名称,价格等信息的输入相关信息,然后程序输出这些信息 break; default: //选择错误 continue_e=false; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G皮T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值