因为整个项目要求将数据写入文件所以,我们将文本的读写操作都封装在工具中这样能大大提高程序的复用性:
1.反序列化方法:Public static< T > List< T > myReader(String fIleName, T t);
-因为整个程序中要将各种不同类型对象的从文本中读取出来,所以采用泛型,这样可以提高方法的复用性。
将文本中的对象进行反序列化的时候,要明确给出对象的个数,否则获取的次数超过文本中的对象上限时就会出现java.io.EOFException异常,反之,当出现异常出现的时候,就代表文本中的对象全部读取完毕,此时,退出循环即可。
下面展示一些 内联代码片
。
List<T> arr=new ArrayList<T>();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(fileName))
for(;;){
try{
Object o=ois.readObject();
T o1=(T)o;
arr.add(o1);
}
catch(java.io.EOFException e){
break;
}
}
return arr;
}
2.序列化方法:public static< T > void myWriter(List< T >,String fileName);
方法一:
因为我们的图书管理系统要随机的增加和改写对象,所有当我们的程序结束之后序列化流也随之关闭,当我们在次打开程序增加对象时,程序会重新创建一个序列化流进行序列化。当不同的序列化流将对象序列化到同一个文本文件时,反序列化读取数据的时候就会发生java.io.EOFException异常,这是因为序列化流在进行序列化第一个对象之前会调用writeStreamHeader方法写入一个头文件,所以我们要重写writeStreamHerder方法,判断如果是第一次写文件就写入头文件,否则不写入头文件。
// An highlighted block
var foo = 'bar';import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class MyObjectOutPutStream extends ObjectOutputStream {
public MyObjectOutPutStream(OutputStream out) throws IOException {
super(out);
}
public MyObjectOutPutStream() throws IOException {
super();
}
//重写writeStreamHeader方法
@Override
protected void writeStreamHeader(){
return;
}
}
public static < T > void myWriter(String fileName,T t){
File f=new File("fileName")
if(!f.exit()){
f.createNewFile();
}
FileOutPutStream fos=new FileOutPutStream(f,ture);
ObjectOutPutStream oops=null;
//判断是否是第一次写入。
if(f.length()<1){
oops=new ObjectOutPutStream(fos);
}else{
oops=new MyObjectOutPutStream(fos);
}
oops.writeObject(t);
fos.close();
}
方法二:
对于图书管理系统中的序列化问题,其实我们也可以直接将文本中的所有对象全部读取并存储在集合中然后直接对集合进行操作,在需要再次序列化的时候,我们只需要将集合全部序列化进入文本并将前面的内容覆盖即可。
下面展示一些 内联代码片
。
public static <T> void write(ArrayList<T> arr, String fileName) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
for (T t : arr) {
oos.writeObject(t);
}
oos.close();
}
**3.public static int getDayNum(String borroDate,String returnDate);输入借书日期和还书日期,然后计算两者之间相距的天数。(字符串格式:yyy-MM-dd)
在读书管理系统中有一个重要的需求就是计算罚金,计算罚金就要得到两个日期之间相差的天数;
将两个时间点的年差转换为月差(这里只计算年差)
将年差*12即可。
反回每个月的天数。
public static int monthday(int borrowMonth){
if (borrowMonth == 1 || borrowMonth == 3 || borrowMonth == 5 || borrowMonth == 7 || borrowMonth == 8 || borrowMonth == 10 || borrowMonth == 12) {
return 31;
} else if (borrowMonth == 2) {
return 28;
} else {
return 30;
}
}
//borrowDate 借书日期,return book 还书日期。
public static int getNumOfDay(String borrowDate, String returnDate) {
//将字符串转换为整型
String[] split = borrowDate.split("-");
String[] split1 = returnDate.split("-");
Integer borrowMonth = Integer.valueOf(split[1]);
Integer returnMonth = Integer.valueOf(split1[1]);
Integer borrowYear = Integer.valueOf(split[0]);
Integer returnYear = Integer.valueOf(split1[0]);
Integer borrowDay = Integer.valueOf(split[2]);
Integer returnDay = Integer.valueOf(split1[2]);
if(Integer.valueOf(split[0])>Integer.valueOf(split1[0])){
System.out.println("输入的年份有误");
return 0;
}else {
//年差
int distanceYear=returnYear-borrowYear;
//年差转月差
int moth = distanceYear*12;
int moth2=returnMonth+moth- borrowMonth;
//月差转日差
int daySum=0;
for(int i=1;i<=moth2;i++){
if(returnMonth-i==0){
returnMonth+=12;
}
daySum+=monthday(returnMonth-i);
}
return returnDay+daySum-borrowDay;
}
**4.记录日志
在图书管理系统中要求我们把进行增删改查操作和出现异常时将日志记录入文本,我们只需要在进行操作之后将内容通过字符串写入文本即可。
下面展示一些 内联代码片
。
/**
* 添加日志
* @param s:要记录日志的内容,以字符串形式写入
* @throws IOException
*/
public static void record(String s) throws IOException {
File f=new File("library\\src\\File\\logLibrary.txt");
FileWriter fw=new FileWriter(f,true);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(getCurrentTimes());
bw.write("-----");
bw.write(s);
bw.newLine();
bw.close();
}
**5.读者编号的录入:
因为图书管理系统对读者编号的要求是固定八位,且不能为空,所有不能录入enter键,然而在修改信息的时候又需要录入entry键来表示不修改这一条信息,这时我们可以引用一个boolean类型的形参来确定要不要接收entry。
下面展示一些 内联代码片
。
public static String inputReaderID(Boolean enter){
Scanner sc=new Scanner(System.in);
String s = sc.nextLine();
//如果运行接收enter且为enter,直接返回s;
if(enter&&s.equals("")){
return s;
}
else if(s.equals("")){
//不允许接收enter,重新输入。
System.out.println("输入有误,编号不能为空,请重新输入:");
s=inputReaderID(enter);
}
else if(s.length()!=8){
//编号不为八位,重新输入。
System.out.println("输入编号有误,编号为8位");
s=inputReaderID(enter);
}
return s;
}
虽然八位的时候一定不可能是enter但是项目要求不能为空,所以判断是不是enter。