Books.java:

    这个文件定义了一个Books类。

    规定Books类拥有的属性:int id, String name, String publish, double price, int number, double money。

    重写了toString()方法,方便打印Books类定义的某个实体的信息。

    定义了一个方法:setNum()用来修改Books实体的number。

//将图书信息封装成一个实体类
public class Books{
int id;
String name;
String publish;
double price;
double money;
int number;
public Books(int id, String name, String publish, double price,
int number, double money){
this.id = id;
this.name = name;
this.publish = publish;
this.price = price;
this.number = number;
this.money = money;
}
//toString()将任何对象转换成字符串表达形式
@Override
public String toString(){
String message = "图书编号:" + id + " 图书名称:" + name +
" 出版社:" + publish + " 单价 " + price + " 库存数量:" + number;
return message;
}
public void setNum(int number){
this.number = number;
}
}

  RecordBooksOrder.java:

    init():用来初始化书架,放了三种书~

    getBooksById():根据bookId返回Books实体信息。

    main():运行程序的入口,获取用户输入信息;

        根据图书编号得到的图书信息封装成Books对象;

        调用FileUtil.savebooks()将此次操作信息记录到本地;

        修改书架中图书的数量。

import java.util.*;
public class RecordBooksOrder{
//static关键字来修饰成员变量,该变量被称为静态变量,静态变量被所有实例共享
static ArrayList<Books> booksList = new ArrayList<Books>();
public static void main(String[] args){
//初始化书架
init();
//将书架上所有图书信息打印出来
for(int i=0; i<booksList.size(); i++){
System.out.println(booksList.get(i));
}
while(true){
//获取控制台信息
Scanner scan = new Scanner(System.in);
System.out.println("请输入图书编号:");
int bookId = scan.nextInt();
Books stockBooks = getBooksById(bookId);
if(stockBooks != null){
System.out.println("当前图书信息:");
System.out.println(stockBooks);
System.out.println("请输入当前购买数量:");
int bookNumber = scan.nextInt();
if(bookNumber <= stockBooks.number){
//将输入信息封装成Books对象
Books sellBook = new Books(stockBooks.id, stockBooks.name,
stockBooks.publish, stockBooks.price, bookNumber,
bookNumber*stockBooks.price);
//将本条数据保存至本地文件
FileUtil.saveBooks(sellBook);
stockBooks.setNum(stockBooks.number-bookNumber);
}else{
System.out.println("库存不足!");
}
}else{
System.out.println("图书编码输入错误误!");
}
}
}
private static void init(){
Books book1 = new Books(101, "python", "北邮出版社", 44.50, 100, 4450);
Books book2 = new Books(102, "java", "清华出版社", 30, 50, 1500);
Books book3 = new Books(103, "c++", "人民邮电出版社", 90, 100, 9000);
booksList.add(book1);
booksList.add(book2);
booksList.add(book3);
//System.out.println(book1.id);
}
private static Books getBooksById(int bookId){
for(int i=0; i<booksList.size(); i++){
//System.out.println(bookId);
Books book = booksList.get(i);
if(book.id == bookId){
return book;
}
}
return null;
}
}

  FileUtil.java:

    创建本地文件的名字;

    根据是存在此文件将用户操作信息写入文件。

import java.util.*;
import java.text.*;
import java.io.*;
public class FileUtil{
//被final修饰的变量称为常量,一旦被赋值,其值不能被改变
public static final String SEPARATE_FIELD = ",";
public static final String SEPARATE_LINE = "\r\n";
public static void saveBooks(Books sellBook){
//创建文件名
Date date = new Date();
//parse()返回的是一个Date类型数据,format()返回的是一个StringBuffer类型的数据
DateFormat format = new SimpleDateFormat("yyyyMMdd");
String name = "sell_log" + format.format(date) + ".csv";
InputStream in = null;
//判断本地是否有此文件
try{
//这句话执行,如果没有该文件,会抛出FileNotFoundException异常
in = new FileInputStream(name);
if(in != null){
//存在文件,采取修改文件的方式
in.close();
createFile(name, true, sellBook);
}
} catch (FileNotFoundException e){
//不存在该文件,应创建文件
createFile(name, false, sellBook);
} catch (IOException e){
e.printStackTrace();
}
}
//label=true:存在文件
public static void createFile(String name, boolean label, Books sellBook){
BufferedOutputStream bos = null;
StringBuffer sbf = new StringBuffer();
try{
if(label){
bos = new BufferedOutputStream(new FileOutputStream(name, true));
}else{
bos = new BufferedOutputStream(new FileOutputStream(name));
String[] str = new String[] {"图书编号", "图书名称", "购买数量",
"单价", "总价", "出版社"};
for(String s : str){
sbf.append(s + SEPARATE_FIELD);
}
}
sbf.append(SEPARATE_LINE);
sbf.append(sellBook.id).append(SEPARATE_FIELD);
sbf.append(sellBook.name).append(SEPARATE_FIELD);
sbf.append(sellBook.number).append(SEPARATE_FIELD);
sbf.append(sellBook.price).append(SEPARATE_FIELD);
sbf.append(sellBook.money).append(SEPARATE_FIELD);
sbf.append(sellBook.publish).append(SEPARATE_FIELD);
String str = sbf.toString();
byte[] b = str.getBytes();
for (int i=0; i<b.length; i++){
bos.write(b[i]);
}
} catch(Exception e){
e.printStackTrace();
} finally{
try {
if(bos!=null)
bos.close();
}catch(Exception e2){
e2.printStackTrace();
}
}
}
}

直接在excel里打开我们写好的.csv文件可能会乱码:

需要修改一下excel的编码格式:

excel里点击【数据】【从文本】:选择文件原始格式:UTF-8

分隔符为逗号:

ok啦~:

java——保存书店每日交易记录程序设计的更多相关文章

  1. 《Effective Java》笔记45-56:通用程序设计

    将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性. 要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声明,不要过早的声明. 局部变量的作用域从它被声明的 ...

  2. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  3. Java 需要记得、了解的关键词 (Java 学习中的小记录)

    Java 需要记得.了解的关键词 (Java 学习中的小记录)     作者:王可利(Star·星星) 总结:本次随笔,仅且拿来平时翻阅记忆用

  4. java实现点名,并记录被点次数

    java实现点名,并记录被点次数 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStrea ...

  5. java保存json格式数据,保存字符串和读取字符串

    1.java保存json格式数据,保存字符串和读取字符串 import java.io.*; class RWJson { public void wiite(String s, String toS ...

  6. 云服务器 ECS Linux 保存用户登录操作命令记录

    转载自 : https://help.aliyun.com/knowledge_detail/41210.html 云服务器 ECS Linux 如果要保存用户登录操作记录,则可以通过在 /etc/p ...

  7. 实践作业4:Web测试实践(小组作业)每日任务记录2

    实践作业4:Web测试实践(小组作业)每日任务记录2 会议时间:2017年12月22日 会议地点:东九教学楼自习区 主  持  人:王晨懿 参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元 记  录 ...

  8. 个人支付宝监控并自动获取交易记录对接系统API

    我们都知道,支付宝支付API接口只有企业才能使用,但有一部分业务,可能我们不方便使用企业收款,但又想做到自动化,那怎么办呢 于是一个支付宝交易记录自动监控软件诞生了. 支付宝都有一个收款二维码,收款提 ...

  9. 解决Java保存到数据库中文乱码问题,加useUnicode=true&characterEncoding=UTF-8

    Java保存到数据库中文乱码, 解决方法如下: 我们在连接MySQL数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8,但是问什 ...

随机推荐

  1. Java-马士兵设计模式学习笔记-装饰者模式

    Java装饰者模式简介 一.假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下: 1.Worker.java p ...

  2. kaggle Partial_Dependence_Plots

    # Partial dependence plots# 改变单变量对最终预测结果的影响# 先fit出一种模型,然后取一行,不断改变某一特征,看它对最终结果的印象.# 但是,只使用一行不具有典型性# 所 ...

  3. [译]Javascript中的递归函数

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  4. excel导入工具

    1 介绍 excel导入工具 整个项目的代码结构如下 \---excelExport # 导出工具包 | AsyncExportExcel.java #多线程导出 | ExcelImport.java ...

  5. 《Linux内核设计与实现》读书笔记(五)- 系统调用

    主要内容: 什么是系统调用 Linux上的系统调用实现原理 一个简单的系统调用的实现 1. 什么是系统调用 简单来说,系统调用就是用户程序和硬件设备之间的桥梁. 用户程序在需要的时候,通过系统调用来使 ...

  6. SQLServer存储引擎——01.数据库如何读写数据

    一.引言 在SQL Server数据库中,数据是如何被读写的?日志里都有些什么?和数据页之间是什么关系?数据页又是如何存放数据的?索引又是用来干嘛的? 一起看看SQL Server的存储引擎. 二.S ...

  7. sonar Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar

    背景: 今天在项目根目录执行maven sonar:sonar ,报错信息如下,然后就各种的搜,折腾了多半天天也没找出解决办法,最后打算放弃时,看到一遍文章说是mysql  max_allowed_p ...

  8. UC浏览器体验

    1.用户界面: 有两个页面,一个展示网页应用-可添加自己喜欢的网页应用,另一个用来搜索,有推荐的常用的网址,有UC头条,页面下有设置,整体布局常规 2.短期刺激: 没有特别花哨的地方:个人感觉比较实用 ...

  9. js判断页面从何种浏览器打开

    问题 有时项目需要根据不同的设备进行不同的处理,需要判断到底是哪种设备打开了项目. 移动端浏览器检测 移动终端浏览器版本信息: var browser = { versions: function ( ...

  10. hdu1402(大数a*b&fft模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 给出两个长度1e5以内的大数a, b, 输出 a * b. 思路: fft模板 详情参 ...