第12次作业
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。
2. 面向系统综合设计-图书馆管理系统或购物车
使用流与文件改造你的图书馆管理系统或购物车。
2.1 简述如何使用流与文件改造你的系统。文件中数据的格式如何?
答:
用流与文件改造系统的主要步骤:
- 静态初始化块初始图书馆内的图书的数据。
- 将初始化后的数据使用对象流
ObjectOutputStream
写入文件Book.data
进行保存(用户模块也用类似的方式进行操作)。 - 在图书馆模块中写一个方法,用于保存修改后文件数据,操作过程中数据的修改都将能进行保存(用户模块也要写这个方法)。
文件中数据的格式:用对象流写入文件是以十六进制保存的。
2.2 简述系统中文件读写部分使用了流与文件相关的什么接口与类?为什么要用这些接口与类?
接口:InputStream
、OutputStream
、Serializable
类:ObjectInputStream
和ObjectOutputStream
、文件类File
原因:不使用字节字符流,而使用对象流,是为了可以将一整个对象的信息都存入文件。使用对象流写入或读取对象时,是需要对象序列化的,这时候就要用到Serializable
接口。
2.3 截图读写文件相关代码。关键行需要加注释。
图书馆初始化:
books.put(new Book("红",100,"文学"), 33);
books.put(new Book("橙",101,"艺术"), 44);
books.put(new Book("黄",102,"经济"), 66);
books.put(new Book("绿",103,"娱乐"), 11);
books.put(new Book("青",130,"杂志"), 22);
books.put(new Book("蓝",140,"报纸"), 55);
books.put(new Book("紫",300,"哲学"), 44);
//使用ObjectOutputStream类将这些图书信息写入文件且保存
File file = new File("Books.data");
if(!file.exists()){//文件不存在时,创建文件,并将图书信息写入文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
Iterator<Map.Entry<Book, Integer>> m = books.entrySet().iterator();
while(m.hasNext()){
Map.Entry<Book, Integer> e = m.next();
oos.writeObject(e.getKey());
oos.writeObject(e.getValue());
}
oos.close();
}
else{//文件存在时,直接从文件中读取数据
try{
System.out.println("hhhhh");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
Book b = (Book)ois.readObject();
while(b!=null){
int num = (int)ois.readObject();
books.put(b,num);
}
ois.close();
}catch(Exception e){//使用对象流读取到文件尾的时候会提示EOFException异常,所以进行try/catch处理
}
}
用户初始化:
public static void initializeAdministrator( ) throws ClassNotFoundException, FileNotFoundException, IOException{
userSet.add(new Administrator("管理员", 0, "0"));
userSet.add(new Student("yellow", 00000, "huang"));
userSet.add(new Student("red", 12345, "hong"));
File file = new File("Users.data");
if(!file.exists()){ //文件不存在时,将用户信息写入文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
for(User u:userSet)
oos.writeObject(u);
oos.close();
}
else{//文件存在时,直接读取文件内信息
ObjectInputStream ois;
try {
ois = new ObjectInputStream(new FileInputStream(file));
User u=(User)ois.readObject();
while(u!=null){
if(u instanceof User)
userSet.add(u);
u=(User)ois.readObject();
}
ois.close();
} catch (Exception e) {//使用对象流读取到文件尾的时候会提示EOFException异常,所以要进行try/catch处理
}
}
}
修改后的图书信息的保存:
private static void saveBookData() throws IOException{//书籍信息改动之后进行的保存
File file = new File("Books.data");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
Iterator<Map.Entry<Book, Integer>> m = books.entrySet().iterator();
while(m.hasNext()){
Map.Entry<Book, Integer> e = m.next();
oos.writeObject(e.getKey());
oos.writeObject(e.getValue());
}
oos.close();
}
修改后的用户信息的保存:
public static void saveUser() throws IOException{//用户信息改动之后进行的保存
File file = new File("Users.data");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
User u;
for(User u1:userSet){
oos.writeObject(u1);
}
oos.close();
}
3. 代码量统计
3.1 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周次 | 行数 | 新增行数 | 文件数 | 新增文件数 |
---|---|---|---|---|
1 | 115 | 115 | 17 | 17 |
2 | 421 | 306 | 24 | 7 |
3 | 698 | 277 | 30 | 6 |
5 | 1085 | 387 | 38 | 8 |
6 | 1497 | 412 | 48 | 10 |
7 | 2033 | 536 | 57 | 9 |
8 | 2265 | 232 | 60 | 3 |
9 | 2728 | 522 | 65 | 5 |
10 | 3360 | 632 | 73 | 8 |
11 | 3958 | 598 | 83 | 10 |
12 | 4435 | 477 | 90 | 7 |
13 | 4802 | 367 | 96 | 6 |