飞道的博客

设计思路+精写代码——Java使用 I/O流 编译图书管理系统——保存书店每日交易记录程序设计!

297人阅读  评论(0)

任务描述:

1、该程序运行时,首先显示书店中所有的书籍。

2、当用户输入图书编号时,可以查询到该编号对应的图书信息。

3、用户继续输入购买数量,程序可以判断库存是否充足,如果充足,则将购买信息存入本地文件。

3.1、保存时需要判断是否存在当天数据,如果存在,则追加,如果不存在则新建。

3.2、文件命名格式为“销售记录”加上当天日期加上“.csv”后缀

实现思路:

1、书店必须有书,创建实体书类Book(编号,名称,价格,出版社,库存)

2、书要放在书架上,在程序中,谁能作为书架呢?那么集合ArrayList把书添加到集合中。

3、显示所有书,遍历集合。

4、键盘录取编号,遍历集合,判断输入的编号和遍历到书的编号比较,如果相等,就返回这本书

5、键盘录取数量,判断返回这本书的库存量和录入数量比较,如果大于录入的数量,把购买这本书的信息写到本地文件中。

代码分部实现:

首先要实现的就是要定义Book类,定义相应的构造方法和get、set方法。
要注意,不要忘记重写toString方法

public class StoreBook {
  public static void main(String[] args) {
   
  }
}
class Book{
 private int id;
 private String name;
 private double price;
 private int number;
 private String publice;
 public Book(int id, String name, double price, int number, String publice) {
  super();
  this.id = id;
  this.name = name;
  this.price = price;
  this.number = number;
  this.publice = publice;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public double getPrice() {
  return price;
 }
 public void setPrice(double price) {
  this.price = price;
 }
 public int getNumber() {
  return number;
 }
 public void setNumber(int number) {
  this.number = number;
 }
 public String getPublice() {
  return publice;
 }
 public void setPublice(String publice) {
  this.publice = publice;
 }
 public String toString() {//------------------------重写toString方法
  String message = "图书编号:"+getId()+"\t图书名称:"+getName()+"\t图书价格:"+getPrice()+"\t图书出版社:"+getPublice()+"\t图书库存量:"+getNumber();
  return message;
 }
}

如何创建书架唉?

static ArrayList<Book> booklist = new ArrayList<Book>();

知道为什么上面的集合要定义成静态的吗?因为这样更方便成员方法中该集合的调用。

书架还要添加书的内容:
这个时候,定义一个成员方法即可:

public static void init() {//静态方法只能引用静态成员------------------把书添加到集合中的成员方法
  Book b1 = new Book(101,"java基础",60,30,"山东大学出版社");
  Book b2 = new Book(102,"武林外传",48.8,10,"国蛮出版社");
  Book b3 = new Book(103,"那些年一起追过的女孩",38.8,53,"匡威出版社");
  Book b4 = new Book(104,"红蛇崛起之战",55.8,2,"颖彤出版社");
  booklist.add(b1);
  booklist.add(b2);
  booklist.add(b3);
  booklist.add(b4);
 }

还想根据书的编号来查找书籍并返回查找到的书籍,这个时候也只需要定义一个成员方法即可:

 public static Book getBookById(int id) {//根据书的编号来查找书籍并返回查找到的书籍
  for(Book thisbook : booklist) {
   if(thisbook.getId()==id)
    return thisbook;
  }
  return null;//未查找到书籍的编号时返回空
 }

那么如何将文件命名格式为“销售记录”加上当天日期加上“.csv”后缀?

class FileUtil{
 static final String a = "\r\n";
 static final String b = ",";
 public static void savaName(Book book) throws IOException {
  Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  String riqi =sdf.format(date);
  String filename = "销售记录"+riqi+".csv";

最关键啊,最重要的部分来了,仔细看,做好笔记:
如何将文件写入本地文件呢?

那么需要根据文件是否存在,来新建或者修改文件,并向文件中添加内容

public static void creatFile(String name,Book book,boolean flag) throws IOException {//如果有文件追加内容,没有文件,创建文件再添加内容 
   BufferedOutputStream bos = null;
   StringBuffer sb = new StringBuffer();//方便追加内容 ,用来保存购买的书的记录,因为长度可变,用于追加
   try {
    if(flag) {//文件存在
    bos = new  BufferedOutputStream(new FileOutputStream(name,true));
    }else {
     bos = new BufferedOutputStream(new FileOutputStream(name,true));
     String []title = {"图书编号","图书名称","购买数量","单价","总价","出版社"};//用来保存表头
     //把表头的内容加到sb中
     for(String first : title)
      sb.append(first).append(b);
    }
    //将书的内容添加到StringBuffer中
    sb.append(a);//首先添加换行符
    sb.append(book.getId()).append(b);//添加图书编号
    sb.append(book.getName()).append(b);
    sb.append(book.getNumber()).append(b);
    sb.append(book.getPrice()).append(b);
    sb.append(book.getNumber()*book.getPrice()).append(b);
    sb.append(book.getPublice());
    String str = sb.toString();
    byte[] bt = str.getBytes();
     bos.write(bt);
     bos.flush();//刷新,清空缓冲区
   } catch (FileNotFoundException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
  }
   if(bos!=null)
    bos.close();
 }
if(book.getNumber()>=buynumber) {
    //把购买的信息存入到 storebook 中
    Book storebook = new Book(book.getId(),book.getName(),book.getPrice(),buynumber,book.getPublice());
    //把信息保存到本地文件
    FileUtil.savaName(storebook);
    //修改库存量
    book.setNumber(book.getNumber()-buynumber);
   }else
    System.out.println("对不起,库存不足");
  }else
   System.out.println("图书编号未查找到!");
  }
File f = new File(filename);//相对路径的文件表示
  if(f.exists())//文件存在
   creatFile(filename,book,true);
  else
   creatFile(filename,book,false);

上面的代码都是分步实现的,那么根据我的前提思路加上上面的散散碎碎的代码

如果你可以大致的了解这些代码应该怎么放置,怎么进行拼接的话,说明你已经懂得了大体的思路过程

如果思路不过于清晰的话,下面的完整代码中还会有部分相应的注释

下面来看完整的代码块演示:

完整代码块:

package liu;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

class Book{
 private int id;
 private String name;
 private double price;
 private int number;
 private String publice;
 public Book(int id, String name, double price, int number, String publice) {
  super();
  this.id = id;
  this.name = name;
  this.price = price;
  this.number = number;
  this.publice = publice;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public double getPrice() {
  return price;
 }
 public void setPrice(double price) {
  this.price = price;
 }
 public int getNumber() {
  return number;
 }
 public void setNumber(int number) {
  this.number = number;
 }
 public String getPublice() {
  return publice;
 }
 public void setPublice(String publice) {
  this.publice = publice;
 }
 public String toString() {//------------------------重写toString方法
  String message = "图书编号:"+getId()+"\t图书名称:"+getName()+"\t图书价格:"+getPrice()+"\t图书出版社:"+getPublice()+"\t图书库存量:"+getNumber();
  return message;
 }
}
//======================================================================================================
//======================================================================================================
//======================================================================================================
public class BuyBookRecord{
 static ArrayList<Book> booklist = new ArrayList<Book>();
 public static void main(String[] args) throws IOException {
  //FileUtil.savaName();
  //初始化书架,把书添加到集合中
  init();
  for(Book b : booklist) {
   System.out.println(b);
  }
//  for (int i = 0; i < booksList.size(); i++) {
//   System.out.println(booksList.get(i));
//  }
  //查找图书,并返回查找到的图书信息
  while(true) {
  System.out.print("请输入你要查找图书的编号:");
  Scanner sc = new Scanner(System.in);
  int id = sc.nextInt();
  if(id==0) {
   System.out.println("图书查询结束,感谢您的使用");
   break;
  }
  Book book = getBookById(id);
  if(book!=null) {
   System.out.println("当前图书信息为:"+book);
   System.out.print("请输入购买数量:");
   int buynumber = sc.nextInt();
   if(book.getNumber()>=buynumber) {
    //把购买的信息存入到 storebook 中
    Book storebook = new Book(book.getId(),book.getName(),book.getPrice(),buynumber,book.getPublice());
    //把信息保存到本地文件
    FileUtil.savaName(storebook);
    //修改库存量
    book.setNumber(book.getNumber()-buynumber);
   }else
    System.out.println("对不起,库存不足");
  }else
   System.out.println("图书编号未查找到!");
  }
 }
 public static void init() {//静态方法只能引用静态成员------------------把书添加到集合中的成员方法
  Book b1 = new Book(101,"java基础",60,30,"山东大学出版社");
  Book b2 = new Book(102,"武林外传",48.8,10,"国蛮出版社");
  Book b3 = new Book(103,"那些年一起追过的女孩",38.8,53,"匡威出版社");
  Book b4 = new Book(104,"红蛇崛起之战",55.8,2,"颖彤出版社");
  booklist.add(b1);
  booklist.add(b2);
  booklist.add(b3);
  booklist.add(b4);
 }
 public static Book getBookById(int id) {//根据书的编号来查找书籍并返回查找到的书籍
  for(Book thisbook : booklist) {
   if(thisbook.getId()==id)
    return thisbook;
  }
  return null;//未查找到书籍的编号时返回空
 }
}
//======================================================================================================
//======================================================================================================
//======================================================================================================
class FileUtil{
 static final String a = "\r\n";
 static final String b = ",";
 public static void savaName(Book book) throws IOException {
  Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  String riqi =sdf.format(date);
  String filename = "销售记录"+riqi+".csv";
  //System.out.println(filename);

  File f = new File(filename);//相对路径的文件表示
  if(f.exists())//文件存在
   creatFile(filename,book,true);
  else
   creatFile(filename,book,false);
 }

 /**根据文件是否存在,来新建或者修改文件,并向文件中添加内容
  * @param name 保存到本地的文件
  * @param book 追加的购买记录
  * @param flag
  * @throws IOException
  */
 //为方法添加注释块的快捷键为  : Alt+Shift+J
 public static void creatFile(String name,Book book,boolean flag) throws IOException {//如果有文件追加内容,没有文件,创建文件再添加内容 
   BufferedOutputStream bos = null;
   StringBuffer sb = new StringBuffer();//方便追加内容 ,用来保存购买的书的记录,因为长度可变,用于追加
   try {
    if(flag) {//文件存在
    bos = new  BufferedOutputStream(new FileOutputStream(name,true));
    }else {
     bos = new BufferedOutputStream(new FileOutputStream(name,true));
     String []title = {"图书编号","图书名称","购买数量","单价","总价","出版社"};//用来保存表头
     //把表头的内容加到sb中
     for(String first : title)
      sb.append(first).append(b);
    }
    //将书的内容添加到StringBuffer中
    sb.append(a);//首先添加换行符
    sb.append(book.getId()).append(b);//添加图书编号
    sb.append(book.getName()).append(b);
    sb.append(book.getNumber()).append(b);
    sb.append(book.getPrice()).append(b);
    sb.append(book.getNumber()*book.getPrice()).append(b);
    sb.append(book.getPublice());
    String str = sb.toString();
    byte[] bt = str.getBytes();
     bos.write(bt);
     bos.flush();//刷新,清空缓冲区
   } catch (FileNotFoundException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
  }
   if(bos!=null)
    bos.close();
 }
}


当我们运行完之后并输入相对应的信息后,这个时候你要购买的信息就会写入到本地文件中去,你可能会问,为什么我的电脑上什么都没有增加,什么都没有变化,什么也没有出现,这并没有出现什么问题,你只需要进行刷新即可

怎么刷新?为什么我刷新完还是没有呢?那是你刷新的地方不对,你需要在Java项目上进行刷新

你可能电脑出现的这个表打不开,教你一招:
选择这个表进行鼠标右击,打开方式选择为系统编译器即可打开

最终结果:


学习是进步的阶梯

学习是进步的阶梯
学习是进步的阶梯

转载:https://blog.csdn.net/qq_45696288/article/details/106728790
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场