说明
本项目是一个简单的Java程序,利用maven就行构建和ideaj社区版以及jdk11进行编写。项目地址为:图书管理系统,本程序具有增加、删除、查询的功能,其中查询功能支持模糊查询,但是删除功能不支持。利用文本文件来充当数据库程序会自动跳过第一行的表头。如果想自行添加数据记得用中文逗号隔开,程序是通过每一行读取来计算书的数量的。
首先是目录结构
Run类
package tushuguanli;
//作者:我把名字打长就会有人跟着念
public class Run {
public static void main(String a [])
{
GongNeng gongNeng=new GongNeng();
gongNeng.run();
}
}
GongNeng类
package tushuguanli;
import java.util.Scanner;
public class GongNeng {
public static void run()
{
System.out.println("---------------------图书管理系统1.0----------------------------");
ChaXun chaXun=new ChaXun();
chaXun.DuQu();
System.out.println("1、查找");
System.out.println("2、插入");
System.out.println("3、删除");
System.out.println("4、退出");
System.out.println(">>>>请输入你想要的功能所对应的相应数字(列如输入数字1进入到查询功能):");
Scanner scanner=new Scanner(System.in);
String chooseStr=scanner.next();
if (chooseStr.equals("1"))
{
chaXun.choose();
run();
}
else if (chooseStr.equals("2"))
{
ChaRu chaRu=new ChaRu();
chaRu.read();
run();
}
else if (chooseStr.equals("3"))
{
ShanChu shanChu=new ShanChu();
shanChu.choosegonneng();
run();
}
else if (chooseStr.equals("4"))
System.exit(0);
else
run();
}
}
DuQuWenJian类
package tushuguanli;
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class DuQuWenJian {
ArrayList<String> librarylist=new ArrayList<>() ;
static String[] ISBN;//数组要使用静态变量否则新建对象是重新分配内存会把变量里的数据清零
static String[] bookname;
static String[] bookprice;
RandomAccessFile randomAccessFile;
void read(){
int n=-1;
try {
File file;
file = new File("src/main/resources","book.txt");//如果该目录下没有book.txt文件那就会自动创建一个
randomAccessFile=new RandomAccessFile(file,"rw");//参数r代表读取,w代表写入,rw代表既可以读取也可以写入
long length=randomAccessFile.length();//获取文件的长度
long position=0;
randomAccessFile.seek(position);//将读取位置定位到文件的起始位0
while (position<length)//当读取到小于文件的长度的位置是执行下面的代码
{
String str=randomAccessFile.readLine();
if (str.equals(""))//如果是空白行就跳过
{
position=randomAccessFile.getFilePointer();//当读取到空行时获得当前读取文件的位置
continue;//继续循环但是不执行下面的循环语句
}
else
{
byte b[]=str.getBytes("ISO_8859_1");//用ISO_8859_1重新编码,不要使用utf-8进行重新编码否则会乱码
String str2=new String(b);//使用当前机器默认编码将字节数组转换为字符串
String strrepl=str2.replaceAll("\t","");//利用替换函数将\t删除
String strrepl2=strrepl.replaceAll(" ","");//删除空格
StringTokenizer st=new StringTokenizer(strrepl2,",");//分割字符串
while(st.hasMoreTokens()){
librarylist.add(st.nextToken());//将分割的字符串添加到list里
}
}
n++;//书的本数
position=randomAccessFile.getFilePointer();//获得当前读取文件的位置
}
randomAccessFile.close();
ISBN(n);
bookname(n);
bookprice(n);
if ((ISBN!=null)&&(bookname!=null))
{
System.out.println("<----读取文件成功,一共有:"+n+"本书---->");
}
} catch (IOException e) {
System.out.println(e);
}
}
public void ISBN(int n)
{
int n1=0;
ISBN=new String[n];//设置数组长度为书本的数量
for ( int i=3;i<librarylist.size();i+=3)//循环向list获取ISBN码,前三个list数据是表头所以从3开始
{
String ISBNex = librarylist.get(i);
ISBN[n1]=ISBNex;//赋值
n1++;
}
}
public void bookname(int n)
{
int x,y=0;
bookname=new String[n];
for (x=4;x<librarylist.size();x+=3)
{
bookname[y]=librarylist.get(x);
y++;
}
}
public void bookprice(int n)
{
int x,y=0;
bookprice= new String[n];
for (x=5;x<librarylist.size();x+=3)
{
bookprice[y]=librarylist.get(x);
y++;
}
}
}
ChaRu类
package tushuguanli;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class ChaRu {
String Str1;
String Str2;
String Str3;
FileOutputStream fileOutputStream;
public void read() {
try {
File file;
file = new File("src/main/resources","book.txt");//如果该目录下没有book.txt文件那就会自动创建一个
fileOutputStream=new FileOutputStream(file,true);//如果第二个参数设置为TRUE,那么write方法将从文件的末尾写入数据
System.out.println(">输入书本ISBN:");
Scanner scanner=new Scanner(System.in);
Str1=scanner.next();
System.out.println(">输入书名称:");
Scanner scanner1=new Scanner(System.in);
Str2=scanner1.next();
System.out.println(">输入书本价格:");
Scanner scanner2=new Scanner(System.in);
Str3=scanner2.next();
String infoStr="\n"+Str1+", "+Str2+" , "+Str3;
Writerinfo(infoStr);
}
catch (IOException e)
{
System.out.println(e);
}
}
public void Writerinfo(String writeStr) {
String writeStr2;
writeStr2=writeStr;
try {
byte[] c =writeStr2.getBytes("UTF-8");
fileOutputStream.write(c);//插入数据
fileOutputStream.close();
System.out.println("插入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ShanChu类
package tushuguanli;
import java.io.*;
import java.util.Scanner;
import java.util.regex.Pattern;
public class ShanChu {
int bookname_num=0;
int bookISBN_num=0;
DuQuWenJian duQuWenJian=new DuQuWenJian();
public void choosegonneng()
{
duQuWenJian.read();//读取文件
System.out.println(">>>>请选择要按照什么信息来删除书本:(输入1按照书本名称来删除书本信息,输入2按照书本ISBN来删除书本信息,输入数字3重新选择功能,输入其他退出程序)");
Scanner scanner=new Scanner(System.in);
String chooseStr=scanner.next();
if (chooseStr.equals("1"))//选择功能
{
ShuRu_bookname();
}
else if (chooseStr.equals("2"))
{
ShuRu_bookISBN();
}
else if (chooseStr.equals("3"))
{
GongNeng.run();
}
else
{
System.exit(0);
}
}
public void ShuRu_bookname()
{
System.out.println("请输入要删除书本的名称:");
Scanner scanner=new Scanner(System.in);
String bookname=scanner.next();
for (int i=0;i<DuQuWenJian.bookname.length;++i)
{
boolean isMatch = Pattern.matches(bookname, DuQuWenJian.bookname[i]);
if (isMatch==false)
{
bookISBN_num++;//计算匹配的失败次数
continue;
}
else//成功匹配后
{
String deleteStr =DuQuWenJian.ISBN[i]+","+DuQuWenJian.bookname[i]+","+DuQuWenJian.bookprice[i];//获取需要删除书本的一行信息
XieRu(deleteStr);//将需要删除的那行信息传入XieRu函数
break;
}
}
if (bookISBN_num==DuQuWenJian.bookname.length)
{
System.err.println("未查找到需要删除的书本信息");
//失败次次数超过书的数量
}
}
public void ShuRu_bookISBN()
{
System.out.println("请输入要删除书本的ISBN码:");
Scanner scanner=new Scanner(System.in);
String bookname=scanner.next();
for (int i=0;i<DuQuWenJian.ISBN.length;++i)
{
boolean isMatch = Pattern.matches(bookname, DuQuWenJian.ISBN[i]);
if (isMatch==false)
{
bookISBN_num++;//计算匹配的失败次数
continue;
}
else//成功匹配后
{
String deleteStr=DuQuWenJian.ISBN[i]+","+DuQuWenJian.bookname[i]+","+DuQuWenJian.bookprice[i];
XieRu(deleteStr);
break;
}
}
if (bookname_num==DuQuWenJian.ISBN.length)
{
System.err.println("未查找到需要删除的书本信息");
//失败次次数超过书的数量
}
}
public void XieRu(String deleteStr2)
{
String deletestr3;
deletestr3=deleteStr2;
File file = new File("src/main/resources","book.txt");//设置要读取文件的位置,如果没有该文件程序会自动新建一个
String rl;
try {
StringBuffer bf = new StringBuffer();
FileReader fileReader=new FileReader(file);//读取文件
BufferedReader br = new BufferedReader(fileReader);//建立缓冲流
while(( rl = br.readLine()) != null)
{
String r2=rl.replaceAll("\t","");
String r3=r2.replaceAll(" ","");
if (r3.equals(deletestr3))//删除匹配到的书本信息
{
System.out.println("删除成功!");
continue;//如果匹配到需要删除的信息那就跳过这一行,添加下一行的数据
}
else if (r3.equals(""))//删除多余的空白行
continue;
bf.append(rl+"\n");//添加书本信息
}
br.close();
FileWriter fileWriter=new FileWriter(file);//读取文件
BufferedWriter out = new BufferedWriter(fileWriter);//建立缓冲流
out.write(bf.toString());//写入文本
out.flush();
out.close();
}catch (IOException e)
{
System.out.println(e);
}
}
}
ChaXun类
package tushuguanli;
import java.util.Scanner;
import java.util.regex.Pattern;
public class ChaXun {
int z1=0;
int z2=0;
int i=0;
int j=0;
public void DuQu()
{
DuQuWenJian duQuWenJian=new DuQuWenJian();
duQuWenJian.read();//读取文件
}
public void choose(){
int booknum=0;//找到的书的数量
DuQu();//开始读取文件
System.out.println("请选择查询方式(支持模糊查询):");
System.out.println(">>>>输入数字1通过书名来查询,输入数字2通过ISBN码来查询,输入数字3重新选择功能,输入其他退出:");
Scanner scanner=new Scanner(System.in);
String chooseStr=scanner.next();
if (chooseStr.equals("1"))
{
System.out.println("请输入要查询的书本名称:");
Scanner scanner2=new Scanner(System.in);
String y= scanner2.next();
String pattern=".*"+y+".*";//使用正则表达式来进行模糊查询
for (;i<DuQuWenJian.bookname.length;++i)
{
boolean isMatch = Pattern.matches(pattern, DuQuWenJian.bookname[i]);
if (isMatch==false)
{
z1++;//计算匹配的失败次数
continue;
}
else//成功匹配后
{
++booknum;
System.out.println("--------成功匹配到一本书!书的信息为:");
System.out.println("*ISBN:" +DuQuWenJian.ISBN[i]);
System.out.println("*书名:"+DuQuWenJian.bookname[i]);
System.out.println("*价格:"+DuQuWenJian.bookprice[i]);
}
}
System.out.println("||||一共查询到"+booknum+"本书名为(或包含)"+"《"+y+"》"+"的书||||");
if (z1==DuQuWenJian.bookname.length)//失败次次数超过书的数量
{
System.err.println("查询失败!没有该书的数据!");
}
}
else if (chooseStr.equals("2"))
{
System.out.println("请输入要查询的书本的ISBN码:");
Scanner scanner3=new Scanner(System.in);
String y2= scanner3.next();
String pattern=".*"+y2+".*";//使用正则表达式来进行模糊查询
for (;j<DuQuWenJian.ISBN.length;++j)
{
boolean isMatch = Pattern.matches(pattern, DuQuWenJian.ISBN[j]);
if (isMatch==false)
{
z2++;
continue;
}
else
{
++booknum;
System.out.println("--------成功匹配到一本书!书的信息为:");
System.out.println("*ISBN:" +DuQuWenJian.ISBN[j]);
System.out.println("*书名:"+DuQuWenJian.bookname[j]);
System.out.println("*价格:"+DuQuWenJian.bookprice[j]);
}
}
System.out.println("||||一共查询到"+booknum+"本ISBN码为(或包含)"+"【"+y2+"】"+"的书||||");
if (z2==DuQuWenJian.ISBN.length)
{
System.err.println("查询失败!没有该书的数据!");
}
}
else if (chooseStr.equals("3"))
{
GongNeng.run();
}
else
System.exit(0);
}
}
book.txt
ISBN, 书名, 定价
9787302257646, 程序设计基础 , 25
9787302219972 , 单片机技术及应用, 32
9787302203513 , 编译原理 , 46
9787811234923 , 汇编语言程序设计教程, 21
9787512100831 , 计算机操作系统 , 17
9787302265436 , 计算机导论实验指导 , 18
9787302180630 , 实用数据结构 , 29
9787302225065 , 数据结构(C语言版) , 38
9787302171676 , C#面向对象程序设计 , 39
9787302250692 , C语言程序设计 , 42
9787302150664 , 数据库原理 , 35
9787302260806 , Java编程与实践 , 56
9787302252887 , Java程序设计与应用教程, 39
9787302198505 , 嵌入式操作系统及编程, 25
9787302169666 , 软件测试 , 24
9787811231557 , Eclipse基础与应用, 35