java图书管理系统(io操作)

搭建一个工程:BookManager

src包下创建子包  Work   Demo

Work包是工程主包,以下的文件都在这个包内。

Demo包是测试包,测试案例放在里面,可以不写。

 

运行项目自动生成包  data

data包下生成  BookObject.txt      MessageRecord.txt

分别存储   书籍信息    和    操作记录。

 

Main:

package Work;

/******主函数,程序入口*****/

public class Main {

    /**
     * 此方法是程序入口,只需创建menu对象即可开启本程序.
     * @param args main方法,大家都懂
     */
    public static void main(String[] args) {
        Menu menu = new Menu();
    }
}

Book:

package Work;

import java.util.Objects;

/*****图书类*****/

public class Book {

    private String name;//书名
    private String id;//图书号
    private String author;//作者
    private double price;//价格
    private String url;//网址

    //计数与id分配变量
    private static int count=0;//书本计数
    private static int idCount = 0 ;//id号计数
    private static final String id_set = "10000001";//ID生成基础string



    //全参构造
    public Book(String name, String author, double price, String url) {
        this.name = name;
        this.author = author;
        if(price >= 0){
            this.price = price;
        }else{
            System.out.println("price不能小于0,已经给price默认为0元,请使用修改方法修改price!");
        }

        this.url = url;

        //id自动分配,并且增加书本数量
        this.id = (Integer.parseInt(id_set)+ idCount)+"";//分配ID
        idCount++;//学号数量加一
        count++;//书本数量加一
    }

    public Book() {
        //id自动分配,并且增加书本数量
        this.id = (Integer.parseInt(id_set)+ idCount)+"";//分配ID
        idCount++;//学号数量加一
        count++;//书本数量加一
    }

    //比较判断方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return name.equals(book.name);
    }

    //未知
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    //toString
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", url='" + url + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        if(price >= 0){
            this.price = price;
        }else{
            System.out.println("price不能小于0,已经给price默认为0元,请重新使用使用修改方法修改price!");
        }
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) { this.id = id; }

    //id_set不提供任何查询功能
    public static int getCount() { return count; }
    //idCount,count只允许在存储重新读取时清零,不允许获取
    public static void setCount() { Book.idCount = 0; Book.count=0;}
}

Menu:

package Work;

import java.util.ArrayList;
import java.util.Scanner;

/******菜单页面*****/

public class Menu {

    /**
     * 菜单方法,所有的功能入口,使用本程序只需在main方法中创建本类对象即可.
     */
    public Menu() {

        //创建图书操作类对象
        ChangeBook change = new ChangeBook();
        //创建图书排序类对象
        BookList bList = new BookList();
        Scanner sc = new Scanner(System.in);

        //创建图书列表(初始数据从文件导入)
        ArrayList<Book> list = change.read();

        while(true){

            System.out.println("================================");
            System.out.println("           图书管理系统\n");
            System.out.println("          1.查看图书列表");
            System.out.println("          2.添加图书");
            System.out.println("          3.图书排行");
            System.out.println("          4.退出系统\n");
            System.out.println("         请选择服务项目\n                ");

            switch (sc.nextInt()){
                case 1:change.printList(list);//先打印列表
                    change.search(list);//再查询
                    break;
                case 2:change.insert(list);//插入方法
                    break;
                case 3:bList.demo(list);//排序方法
                    break;
                default:System.exit(0);
                    break;

            }
            //文件重新存储读取,刷新数据
            change.write(list);
            list = change.read();
        }

    }
}

ChangBook:

package Work;

import java.io.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Scanner;

/******图书查询、修改、创建、存储*****/

public class ChangeBook {

    /**
     * 此方法用于修改指定图书信息,传入图书列表和所需修改图书id即可.
     * @param list 图书列表
     * @param id 图书id
     */
    //修改
    public void change(ArrayList<Book> list, String id){
        int c;
        String str;
        double d;
        Scanner sc = new Scanner(System.in);
        System.out.println("确认修改 ‘" + id + "’这本书吗?(键入1确认)");
        c = sc.nextInt();
        if(c==1){
            for (Book book : list) {
                if (book.getId().equals(id)) {
                    System.out.println(book.toString());
                    System.out.println("请输入图书新的name(输入-1,不修改):");
                    str = sc.next();
                    //记录修改信息
                    String s = ("message: 修改图书 " + book.getName() + " 信息\ntime: "
                            + Calendar.getInstance().getTime() + "\n");
                    if (!str.equals("-1")) {
                        s += "name: ‘" + book.getName() + "’ --> ‘";
                        book.setName(str);
                        s += book.getName() + "’\n";
                    }
                    System.out.println("请输入图书新的author:");
                    str = sc.next();
                    if (!str.equals("-1")) {
                        s += "author: ‘" + book.getAuthor() + "’ --> ‘";
                        book.setAuthor(str);
                        s += book.getAuthor() + "’\n";
                    }
                    System.out.println("请输入图书新的price:");
                    d = sc.nextDouble();
                    if (!(d + "").equals("-1")) {
                        s += "price: ‘" + book.getPrice() + "’ --> ‘";
                        book.setPrice(d);
                        s += book.getPrice() + "’\n";
                    }
                    System.out.println("请输入图书新的url:");
                    str = sc.next();
                    if (!str.equals("-1")) {
                        s += "url: ‘" + book.getUrl() + "’ --> ‘";
                        book.setUrl(str);
                        s += book.getUrl() + "’\n";
                    }
                    System.out.println("修改完毕(id不可以修改)!");
                    System.out.println(book.toString());

                    s += "\n---------------------------------------\n";
                    record(s);//记录修改信息
                    return;
                }
            }
        }else {
            System.out.println("已经取消修改!");
        }

    }

    /**
     * 此方法用于打印图书列表.
     * @param list 图书列表
     */
    //打印列表
    public void printList(ArrayList<Book> list){
        System.out.println("\n\n《图书列表》\n");
        System.out.println("ID\t\t\t\tName\t\t\t\tAuthor\t\t\t\tPrice\t\tURL");
        //遍历book列表,并打印对应属性
        for(Book book:list){
            System.out.println(book.getId()+"\t\t"+book.getName()+"\t\t\t\t"
                    +book.getAuthor()+"\t\t\t\t"+book.getPrice()+"\t\t"+book.getUrl());
        }
    }


    /**
     * 此方法用于查询图书,此方法会自动调用“打印图书列表”方法,方便用户查询.
     * 再查询到对应图书后,用户可以选择进行修改或者删除操作.
     * @param list 图书列表
     */
    //查询
    public void search(ArrayList<Book> list){
        Scanner sc = new Scanner(System.in);
        String str,demoStr;

        while(true){
            System.out.println("\n\n请输入您想要查询的图书的“name”或者“id”(输入“-1”退出查询系统):");
            str=sc.next();
            boolean flag = false;
            if(str.equals("-1")){
                return;
            }
            else{
                //不适用 for-each 因为可能出现删除操作
                for(int i=0;i<list.size();i++) {
                    //查找到对应的id或者name
                    if (str.equals(list.get(i).getId()) || str.equals(list.get(i).getName())) {
                        System.out.println(list.get(i).getId() + "\t\t" + list.get(i).getName() + "\t\t"
                                + list.get(i).getAuthor() + "\t\t" + list.get(i).getPrice() + "\t\t" + list.get(i).getUrl());
                        demoStr = list.get(i).getId();
                        flag = true;
                        int c;
                        System.out.println("修改图书属性(1)--删除图书(2)--取消操作(-1)");
                        c = sc.nextInt();
                        if (c == 1) {
                            change(list, demoStr);
                            break;
                        } else if (c == 2) {
                            delete(list, demoStr);
                            break;
                        } else {
                            //return;
                            break;
                        }
                    }
                }
                if(!flag){
                    System.out.println("您输入的图书name或id ‘" + str + "’ 不存在,请重新输入。");
                }
            }
        }

    }

    /**
     * 此方法用于插入图书,传入图书列表即可.
     * @param list 图书列表.
     */
    //创建
    public void insert(ArrayList<Book> list){
        String str;
        double d;
        Scanner sc = new Scanner(System.in);
        while(true){
            boolean flag = true;//判断图书名称是否合法
            System.out.println("输入-1退出增加图书,输入0可以导入demo数据(输入其他内容则继续添加):");
            str = sc.next();
            if(str.equals("-1")){
                return;
            }else if(str.equals("0")){
                createDemo(list);
                return;
            }
            Book book = new Book();
            System.out.println("请输入您要添加的图书的name:");
            str = sc.next();
            for(Book bookDemo:list){//图书名称不得重复
                if(bookDemo.getName().equals(str)){
                    System.out.println("已经存在此图书,请勿添加重复图书。\n" +
                            "若是在那个要添加同名书籍,请在书名后方加上大写字母区分\n");
                    flag = false;
                    break;
                }
            }
            if(flag){
                book.setName(str);
                System.out.println("请输入您要添加的图书的author:");
                str = sc.next();
                book.setAuthor(str);
                System.out.println("请输入您要添加的图书的price:");
                d = sc.nextDouble();
                book.setPrice(d);
                System.out.println("请输入您要添加的图书的url:");
                str = sc.next();
                book.setUrl(str);
                System.out.println(book.toString());
                list.add(book);
                String s = ("message: 创建图书 " + book.getName() + "\ntime: "
                        + Calendar.getInstance().getTime()
                        + "\n\n---------------------------------------\n");
                record(s);//记录创建信息
            }
        }

    }

    /**
     * 本方法用于删除图书,传入图书列表和所需删除图书的id.
     * @param list 图书列表
     * @param id 图书id
     */
    //删除
    public void delete(ArrayList<Book> list, String id){
        int c;
        Scanner sc = new Scanner(System.in);
        System.out.println("确认删除 ‘" + id + "’这本书吗?(键入1确认)");
        c = sc.nextInt();
        if(c==1){
            for(int i=0; i<list.size();i++) {
                if (list.get(i).getId().equals(id)) {
                    Book demo = list.remove(i);
                    String str = ("message: 删除图书 " + demo.getName() + "\ntime: "
                            + Calendar.getInstance().getTime()
                            + "\n\n---------------------------------------\n");
                    record(str);//记录删除信息
                    System.out.println("图书 ‘" + demo.getName() + "’ 已经删除!");
                    printList(list);
                    return;
                }
            }
        }else {
            System.out.println("已经取消删除!");
        }
    }

    /**
     * 用于导入demo数据,因为初始化下图书信息为空.
     * 为了方便用户使用,我们提供快速导入测试数据方法.
     * @param list 图书列表
     */
    //导入demo数据
    public void createDemo(ArrayList<Book> list){
        Book book1 = new Book("三国演义", "罗贯中",39.99,"www.bookPlus.com");
        Book book2 = new Book("西游记", "吴承恩",49.99,"www.bookNice.com");
        Book book3 = new Book("红楼梦", "曹雪芹",49.99,"https://blog.csdn.net/may10?spm=1000.2115.3001.5343");
        Book book4 = new Book("水浒传", "施耐庵",29.99,"www.bookOJBK.com");

        //list.add(book1);
        //list.add(book2);
        //list.add(book3);
        //list.add(book4);
        //list.addAll(book1,book2,book3,book4);
        Collections.addAll(list,book1,book2,book3,book4);
        String str = ("message: 图书列表导入demo数据.\ntime: "
                + Calendar.getInstance().getTime()
                + "\n\n---------------------------------------\n");
        record(str);//记录导入信息
    }


    /**
     * 读取图书列表方法,存储文件“data\\BookObject.txt”.
     * 若此文件或者目录不存在则自动创建.
     * @return 返回从文件中读取的信息并存入列表
     */
    //读取
    public ArrayList<Book> read(){
        //初始化Book类的count和idCount
        Book.setCount();
        //创建图书列表
        ArrayList<Book> list = new ArrayList<>();
        //创建目录对象
        File data = new File("data");
        //如果目录不存在则创建目录
        if(!data.exists()){
            boolean b1 = data.mkdir();
        }
        //创建文件对象
        File file = new File(data+"\\BookObject.txt");

        try{
            //如果文件不存在则创建文件
            if(!file.exists()){
                boolean b2 = file.createNewFile();
            }
            //创建字符输入流对象
            FileReader fr = new FileReader(file);
            //创建字符缓存输入流对象
            BufferedReader br = new BufferedReader(fr);
            String string;
            //循环读取文件
            while((string = br.readLine())!=null){
                //将读取到的string切割
                String[] s = string.split("\t\t\t\t");
                //创建图书对象,从文件中获取属性(id不获取,系统每次重新分配)
                Book book = new Book(s[1], s[2], Double.parseDouble(s[3]), s[4]);
                //将图书对象存入集合
                list.add(book);
            }
            //释放资源
            br.close();
            System.out.println("读取数据成功");

        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 存储图书列表方法,存储文件“data\\BookObject.txt”.
     * 若此文件或者目录不存在则自动创建.
     * @param list 图书列表
     */
    //存储
    public void write(ArrayList<Book> list) {

        //创建目录对象
        File data = new File("data");
        //如果目录对象不存在则创建目录
        if(!data.exists()){
            boolean b1 = data.mkdir();
        }
        //创建文件对象
        File file = new File(data+"\\BookObject.txt");
        try {
            //如果文件不存在则创建文件
            if(!file.exists()){
                boolean b2 = file.createNewFile();
            }
            //创建字符输出流对象
            FileWriter fw = new FileWriter(file);
            //创建字符缓冲输出流对象
            BufferedWriter bw = new BufferedWriter(fw);
            //循环存入book对象属性
            for(Book book:list){
                bw.write(book.getId());
                bw.write("\t\t\t\t");
                bw.write(book.getName());
                bw.write("\t\t\t\t");
                bw.write(book.getAuthor());
                bw.write("\t\t\t\t");
                bw.write(book.getPrice()+"");
                bw.write("\t\t\t\t");
                bw.write(book.getUrl());
                //换行
                bw.newLine();
            }
            //刷新并释放资源
            bw.flush();
            bw.close();
            System.out.println("存储数据成功");

        }catch (Exception e){
            e.printStackTrace();
        }

    }


    /**
     * 记录图书信息变更方法,记录文件“data\\MessageRecord.txt”.
     * 若此文件或者目录不存在则自动创建.
     * @param str 信息变更记录
     */
    //图书信息改变记录表
    public void record(String str){
        //创建目录对象
        File data = new File("data");
        //如果目录对象不存在则创建目录
        if(!data.exists()){
            boolean b1 = data.mkdir();
        }
        //创建文件对象
        File file = new File(data+"\\MessageRecord.txt");//信息记录文件

        try {
            //如果文件不存在则创建文件
            if(!file.exists()){
                boolean b2 = file.createNewFile();
            }
            //创建字符输出流对象
            FileWriter fw = new FileWriter(file, true);//追加
            //创建字符缓冲输出流对象
            BufferedWriter bw = new BufferedWriter(fw);

            //存入记录
            bw.write(str);
            bw.newLine();

            //刷新并释放资源
            bw.flush();
            bw.close();
            System.out.println("存储数据成功");

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

BookList:

package Work;

import java.util.*;

/******图书排序类*****/

public class BookList {

    /**
     * 此方法用于给图书列表排序,提供价格升序和价格降序两种排序方式.
     * @param list 图书列表
     */
    //图书排序
    public void demo(ArrayList<Book> list){
        ChangeBook change = new ChangeBook();
        int s;
        Scanner sc = new Scanner(System.in);

        while(true){
            System.out.println("\n请选择排序方式(1.价格升序,2.价格降序,-1.退出排序):");
            s = sc.nextInt();
            if(s==1){
                //集合排序,价格升序
                list.sort(new Comparator<Book>() {
                    @Override
                    public int compare(Book o1, Book o2) {
                        return (int) o1.getPrice() - (int) o2.getPrice();
                    }
                });
                change.printList(list);
            }else if(s==2){
                //集合排序,价格降序
                list.sort(new Comparator<Book>() {
                    @Override
                    public int compare(Book o1, Book o2) {
                        return (int) o2.getPrice() - (int) o1.getPrice();
                    }
                });
                change.printList(list);
            }else{
                return;
            }
        }



    }
}

 

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值