任务描述:
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