码迷,mamicode.com
首页 > 编程语言 > 详细

java粗略版图书管理系统

时间:2020-04-19 12:45:00      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:dom   print   false   回车   adl   ddb   价格   exception   gb2312   

需求:编写“图书管理”程序,能支持对书的增加,删除,查看操作,并支持退出程序功能。

每本书应包括编号,书名,价格。删除书必须输入书的编号,若输入书编号无对应的书则用提示输入有误,若有并删除且提示删除成功。

这个程序我采用IO流去实现,用txt文件存储书籍信息。

一、第一步:创建一个书的类Book.java

package 图书管理程序升级版;

public class Book {
    private String ID;//书的编号
    private String Name;//书名
    private String price;//书的价格
    
    
    public  Book() {
        super();
    }
    public Book(String iD, String name, String price) {
        super();
        ID = iD;
        Name = name;
        this.price = price;
    }
    
    public String getID() {
        return ID;
    }
    public void setID(String iD) {
        ID = iD;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Book other = (Book) obj;
        if (ID == null) {
            if (other.ID != null)
                return false;
        } else if (!ID.equals(other.ID))
            return false;
        if (Name == null) {
            if (other.Name != null)
                return false;
        } else if (!Name.equals(other.Name))
            return false;
        if (price == null) {
            if (other.price != null)
                return false;
        } else if (!price.equals(other.price))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Book [ID=" + ID + ", Name=" + Name + ", price=" + price + "]";
    }
    

}

 

二、第二步:创建增删修改、查询功能的接口类BookDao.java

package 图书管理程序升级版;
/**
 * 图书馆管理程序的接口
 * @author Asus
 *
 */
interface BookDao {
    public void addBook(Book book);//增添书籍
    
    public void findBook(String bookName);//查询书籍
    
    public boolean alterBook(String BookName,String newstr);//修改书籍内容
    
    public void cancelBook(String bookName,String ID);//删除书籍

}

 

三、第三步:创建接口的实现类BookDaoImpl.java

package 图书管理程序升级版;

import java.io.BufferedReader;

//import static net.mindview.util.Print.print;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;

public class BookDaoImpl implements BookDao{
    private static File file=new File("bookUser.txt");
    private static File file1=new File("temp.txt");
    static {
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
            System.out.println("用户创建信息文件失败");
        }
    }
    /**增添书籍
     * @param Book 书籍信息
     *     
     *  */
    public void addBook(Book book) {
        BufferedWriter bw=null;
        try {
            bw=new BufferedWriter(new FileWriter(file,true));//true代表将数据写入文件末尾处,而不是文件开始处
            bw.write("\r\n");//因为文件最后一行的末尾没有回车换行符,如果不先加回车换行符,就会直接在最后一行写,不会新增一行
            bw.write(book.getID()+"-"+book.getName()+"-"+book.getPrice());
            bw.flush();
            
        } catch (IOException e) {
            
            e.printStackTrace();
        }finally{
            if(bw!=null) {
                 try {
                    bw.close();
                } catch (IOException e) {
                    System.out.println("用户释放资源失败");
                    }
                }
        }
        
    }

/**查询书籍信息
 * @param bookName 用户要查询的书籍名称
 * 
 */
    public void findBook(String bookName) {
        BufferedReader br=null;
        try {
            br=new BufferedReader(new FileReader(file));
            String readLine = "";
            while((readLine = br.readLine()) != null){
                String list[]=readLine.split("-");
                if(list[1].equals(bookName)) {
                    System.out.println("ID:"+list[0]+"\n书名:"+list[1]+"\n价格:"+list[2]);
                    System.out.println("--------------------");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(br!=null) {
                 try {
                    br.close();
                } catch (IOException e) {
                    System.out.println("用户释放资源失败");
                    }
                }
        }
        
    }

/**修改书籍信息
 * @param oldstr 原书籍信息
 * @param newstr 修改后的书籍信息
 * @return
 */
    public boolean alterBook(String oldName,String buffer) {
        File file=new File("bookUser.txt");
        RandomAccessFile raf=null;
        try {
            raf=new RandomAccessFile(file, "rw");
            String Line=null;
            //System.out.println(raf.length());
            
            while((Line=raf.readLine())!=null) {
                String changeLine=new String(Line.getBytes("ISO-8859-1"), "gb2312"); //gb2312是你文本编码格式。

                //查找要替换的内容
                if(changeLine.contains(oldName)) {
                    //得到当前指针的位置,如果不是最后一行,就应该是在oldName\r\n后面;
                    //如果是最后一行,则就在oldName后面
                    long lastpoint=raf.getFilePointer();
                    
                    //如果是最后一行
                    if(lastpoint==raf.length()) {
                        //指针回到行首
                        raf.seek(lastpoint-changeLine.getBytes().length);
                        int currentLength=changeLine.getBytes().length;//原字符串的字节长度,1个中文字符占2字节
                        int targeLength=buffer.getBytes().length;//替换后字符串的字节长度
                        
                        //替换的字符串字节数比源字符串小
                        if(currentLength>targeLength) {
                            int tempLength=currentLength-targeLength;
                            StringBuilder sb=new StringBuilder(buffer);
                            //目的是防止修改的内容没有没全替换掉
                            
                            for(int a=0;a<tempLength;a++) {
                                sb.append(" ");
                            }
                            raf.writeBytes(new String(sb.toString().getBytes("gb2312"), "ISO-8859-1"));
                        }else {
                            //替换的字符串字节数比源字符串大或两者相等
                            raf.writeBytes(new String(buffer.getBytes("gb2312"), "ISO-8859-1"));
                            
                        }
                    }else {//不是最后一行
                        //回到行首,减去2的原因是行末有\r\n,占2字节
                        raf.seek(lastpoint-changeLine.getBytes().length-2);
                        int currentLength=changeLine.getBytes().length;//原字符串的长度
                        int targeLength=buffer.getBytes().length;//替换后字符串的长度
                        //替换的字符串字节数比源字符串小,目的是防止修改的内容没有没全替换掉
                        if(currentLength>targeLength) {
                            int tempLength=currentLength-targeLength;
                            StringBuilder sb=new StringBuilder(buffer);
                            //源字符串没替换的字符用空格代替                            
                            for(int a=0;a<tempLength;a++) {
                                sb.append(" ");
                            }
                            
                            raf.writeBytes(new String(sb.toString().getBytes("gb2312"), "ISO-8859-1"));
                        }else {
                            //替换的字符串比源字符串大或两者相等
                            raf.writeBytes(new String(buffer.getBytes("gb2312"), "ISO-8859-1"));                            
                        }
                        
                    }
                    break;
                }

            }
            
        } catch (Exception e) {            
            e.printStackTrace();
        }finally{
            if(raf!=null) {
                 try {
                    raf.close();
                } catch (IOException e) {
                    System.out.println("用户释放资源失败");
                    }
                }
        }
        return true;        
    }


    /**删除书籍信息
     * @param bookName 用户要删除的书籍名称
     * @param ID 用户输入该书籍的编号
     */
    public void cancelBook(String bookName,String ID) {
        boolean flag=false;
        BufferedWriter bw=null;
        BufferedReader br=null;
        StringBuilder sb=null;
        try {
            bw=new BufferedWriter(new FileWriter(file1));
            br=new BufferedReader(new FileReader(file));
            String line=null;
            sb=new StringBuilder();
            while((line=br.readLine())!=null) {
               //如果不是要删除的内容
                if(line.contains(bookName)) {
                    String []data=line.split("-");//将书籍编号、书籍名、书籍价格存在数组中
                    if(!ID.equals(data[0]))
                        System.out.println("输入编号不正确"); 
                    else
                        //如果删除的书籍信息都匹配成功
                        flag=true;
                }else {
                    sb.append(line).append("\r\n");//存储没有被删的书籍信息
                    int lastindex=sb.lastIndexOf("\r\n");//获取最后一行书籍信息的回车换行符索引
                    sb.delete(lastindex,sb.length());//删除最后一行书籍信息的回车换行符
                }
            }
            //如果输入的删除信息都匹配成功,就开始删除信息
            if(flag) {
                bw.write(sb.toString());//将字符串写进新的文件中
                //重命名文件必须先关闭流
                bw.close();
                br.close();
                if(file.delete())//重命名前必须删除同名文件
                    file1.renameTo(file);
                
            }
            
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(br!=null&bw!=null) {
                 try {
                    bw.close();
                    br.close();
                } catch (IOException e) {
                    System.out.println("用户释放资源失败");
                    }
                }
        }
        
        
        
    }

}

 

四、最后一步:测试类Test.java

package 图书管理程序升级版;

import java.util.Scanner;



public class Test {
    public static void main(String args[]) {
        
        String str="y";
        Scanner sc=new Scanner(System.in);
        BookDao ud=new BookDaoImpl();

        //欢迎界面
        while(str.equals("y")) {
            System.out.println("----------欢迎光临-----------");
            System.out.println("1 增添书籍");
            System.out.println("2 查询书籍");
            System.out.println("3 修改书籍");
            System.out.println("4 删除书籍");
            //键盘录入选择项目
            
            System.out.println("请输入你的选项:");
            String choice=sc.nextLine();
            
            
            switch (choice) {
            case "1": {                
                System.out.println("请输入书籍的编号:");
                String ID=sc.nextLine();
                System.out.println("请输入书籍名称:");
                String name=sc.nextLine();
                System.out.println("请输入书籍价钱:");
                String price=sc.nextLine();
                Book book=new Book(ID,name,price);
                ud.addBook(book);

                break;            
            }
            case "2":
                System.out.println("请输入要查询的书籍名称:");
                String findName=sc.nextLine();
                ud.findBook(findName);
                break;
            case "3":
                StringBuffer buffer=new StringBuffer();
                
                System.out.println("请输入你要修改的书籍名称:");
                String oldName=sc.nextLine();
                ud.findBook(oldName);
                System.out.println("修改后的书籍编号是:");
                String new1=sc.nextLine();
                System.out.println("修改后的书籍名称是:");
                String new2=sc.nextLine();
                System.out.println("修改后的书籍价格是:");
                String new3=sc.nextLine();
                buffer.append(new1).append("-").append(new2).append("-").append(new3);                
                if(ud.alterBook(oldName,buffer.toString())) {
                    System.out.println("修改成功!修改后的信息是:");
                    ud.findBook(new2);
                }
                break;
            case "4":
                System.out.println("请输入你要删除的书籍名称:");
                String name=sc.nextLine();
                System.out.println("请输入该书籍的编号:");
                String id=sc.nextLine();
                ud.cancelBook(name, id);
                break;
            default:
                System.out.println("欢迎下次光临");
                System.exit(0);
            
         }
        System.out.println("是否继续查询:y/n");
        str=sc.nextLine();
        if(str.equals("n")) {
            System.out.println("欢迎下次光临");
            break;
        }
     }
        
    }

}

结果:

技术图片

 

 

 技术图片

小结:

java小白,没怎么优化,代码有点长。这个程序做了差不多一周,因为卡在修改书籍那里了,修改书籍采用了RandomAccessFile(随机访问流),可以在当前文件修改内容,不用修改一次就重新创建一个新文件。接下来想跟安卓一起结合起来,做一个登录图书管理系统页面。希望可以做出来。

 

java粗略版图书管理系统

标签:dom   print   false   回车   adl   ddb   价格   exception   gb2312   

原文地址:https://www.cnblogs.com/panqiaoyan/p/12730804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!