Java基础案例教程第二版
Java基础程序设计的报告
Java IO(输入输出)程序设计
设备仪器/软件环境
1.Windows7以上Windows系列操作系统
2.JDK8
3.eclipse
实验(实训)目标
1.掌握字节流操作本地文件的方法。
2.掌握ArrayList和StringBuffer的使用,以及异常的处理
3.了解csv的文件格式。
4.掌握StringBuffer和数组的使用。
实验(实训)过程/步骤
实施步骤及相关过程运行效果截图
项目一:商城进货交易记录程序设计
为了方便保存商品的相关信息,可以将图书信息封装为一个实体类。商品进货过程中可能会打印图书相关信息,所以需要对该实体类的toString()方法进行重写,使其能更清晰地显示商品信息,商品每次进货后要修改库存数量,需要在实体类中编写一个操作库存数量的方法。
对于一个超市,首先会有很多商品,商品需要不断进货。这里我们需要创建一个集合用于模拟超市仓库,然后向集合中添加有具体信息的商品对象,这样一个超市就有了商品。
管理员进货是通过在控制台键盘输入商品编号和购买数量的方式进行的,如果商品编号正确,且购买数量也正常,则商品进货成功,并将此商品的进货信息保存到csv文件中,同时要将库存数量增加。
查询商品信息时,可以通过Scanner类的nextInt()方法从控制台获取商品编号,之后根据这个编号到库存中查询此商品的信息,如果查到了商品的信息,从控制台获取进货的数量之后,将此商品的所有信息进行封装。
将商品的销售信息写入到csv文件之前,需先拼凑好csv文件名,再判断本地是否已存在此文件,这里可通过输入流尝试获取此文件的字节流,如果获取成功,则证明这个文件已存在,那么就通过输出流向文件末尾追加销售信息,如果获取失败,即异常,说明之前并没有生成当日的销售信息,则需要新建此文件。
将封装的信息写入csv文件中时,csv格式的文件以纯文本形式存储表格数据,写入文件时可以用图7-1的格式写入,当此类文件用Excel格式打开的时候,展现信息如图7-11。
在拼凑csv文件名时,需要获取当日的日期。这里可以通过以下代码来获取并拼凑csv文件名:
DateFormat format = new SimpleDateFormat(“yyyyMMdd”);// 定义日期格式
String name = “进货记录” + format.format(date) + “.csv”;// 拼接文件名
项目二: 升级版日记本
(1)根据任务介绍和运行结果分析可知,此任务需要创建一个记事本类,在类中可以使用while循环实现控制台中操作指令的多次输入,使用switch语句根据控制台输入的操作指令来判断执行什么操作。
(2)输入指令1时进行新建文件操作,此时需要从控制台获取输入的内容并暂存到全局变量中,以便后期进行保存和修改内容时使用。可以使用StringBuffer来保存控制台中每次输入的内容,输入内容时可能会涉及换行,这里可以使用while循环来循环输入,每循环一次都将控制台获取的内容拼接换行符后,追加到文本内容中,当内容中输入“stop”字符串时,输入文本内容的操作结束,并将新建文本的内容暂存在全局变量中。
(3)执行指令2时,可以打开指定路径的文件,由于是模拟记事本程序,因此限定此功能只支持打开txt文件。此操作首先要获取输入的路径,判断此路径的文件是否是txt文件,如果是则通过字符流读取此文件,然后将此文件的内容打印至控制台,并且暂存在全局变量中,将文件的路径也保存至全局变量中。
(4)执行指令3时,可以对暂存在全局变量中的文本内容进行修改,修改后的内容也需要暂存到全局变量中。此操作首先要判断一下修改之前是否先经过新建文件或者打开文件操作,当确认经过上述操作后,可以将输入的字符串与文本内容中目标字符串进行替换,来完成修改内容功能。修改过程可通过while循环来进行多次的修改,当捕捉到“stop”字符串时修改结束,并将修改后的内容暂存到全局变量中。
(5)执行指令4时,将所有全局变量中的内容保存至本地,如果是新建的文件则保存至用户输入的路径,如果是打开后的文件则将原文件覆盖。可以通过文件路径的全局变量判断是哪种保存方式,当是打开文件的方式时,直接通过字符流写入;当是新建的方式时,先获取用户输入的路径,再用字符流写入。
(6)执行指令5,直接退出系统,可以通过代码“System.exit(0);”实现。
项目三:微信投票
(1)查看任务介绍和运行结果分析可知,此任务需要使用while循环实现控制台中操作指令的多次输入,使用switch语句根据控制台输入的操作指令来判断执行什么操作。
(2)输入指令1时进行添加候选人操作,先从控制台获取输入的被投票人与起始票数并暂存,再判断是否已有count.txt文件存储数据,如果有直接在文件后追加新的数据,如果没有需要新建文件夹在存入数据。这里需要使用到StringBuffer的字符串拼接来实现存入count.txt文件的特定格式,例如:“姓名:票数,”,这样方便我们读取和修改票数。
(3)输入指令2时查看当前投票,使用字符流读取count.txt文件并在控制台打印即可。
(4)输入指令3时进行投票操作,从控制台输入被投票人姓名,投票成功后,被投票人的票数加一,先取出count.txt的内容存入String类型中,根据“,”拆分为String数组(editMessage),再获取控制类中输入的被投票人姓名,使用for循环判断是否存在此人的投票,如果存在,则取出此人的票数加一,最后将修改后的数据使用StringBuffer替换到String数组(editMessage)并覆盖原有的count.txt文件
(4)输入指令4,直接退出系统,可以通过代码”System.exit(0);”实现。
结果记录与分析总结
项目任务运行效果截图
项目一:商城进货交易记录程序设计
项目二: 升级版日记本
项目三:微信投票
结果记录与分析总结
项目任务实施中用到的知识总结及遇到的问题分析
File类中的java.io包是唯一代表磁盘文件本身的对象,它定义了一些与平台无关的方法用于操作文件。通过调用 Fie类提供的各种方法,能够创建、刷除或者重命名文件,判断硬盘上某个文件是否存在,最后修改时间等。
在创建 File 对象时传入的路径使用了“\”,这是因为在Windows 中目录符号为反斜线“\””,但反斜线“\”在Java 中是特殊字符,表示转义符,所以使用反斜线“\”时,前面应该再添加一个反斜线,即为“\”。除此之外,目录符号还可以用正斜线“/”表示,如“D:/file/a.txt”。
File的类中提供了一个重载的list(Filenamefilter filter)方法,该方法接收一个Filenamefilter类型的参数。Filenamefilter是一个接口,称为文件过滤器,当中定义了一个抽象方法accept(File dir ,String name)。在调用list()方法时,需要实现文件过滤器Filenamefilter,并在accept()方法中做出判断,从而获得指定类型的文件。
list(Filenamefilter filter)方法的工作原理。
- 调用 list()方法传入 Filenamefilter 文件过滤器对象。
2.取出当前 File 对象所代表目录下的所有子目录和文件。
3.对于每一个子目录或文件,都会调用文件过滤器对象的accept(File dir ,String name)方法,并把代表当前目录的File对象以及这个子目录或文件的名字作为参数dir 和 nane 传递给方法。 - 如果 accept ()方法返回 true,就将当前遍历的这个子目录或文件添加到数组中,如果返回false,则不添加。
微信投票代码
1
package chapter0704;
2 import java.io.BufferedOutputStream;
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.FileOutputStream;
7 import java.io.FileWriter;
8 import java.util.Scanner;
9 public class vote {
10 private static String message = "";
11 public static void main(String[] args) throws Exception {
12 Scanner sc = new Scanner(System.in);
13 System.out.println("1:添加候选人 2:查看当前投票 3:投票 4:退出");
14 while (true) {
15 System.out.print("请输入操作指令:");
16 int command = sc.nextInt();
17 switch (command) {
18 case 1:
19 System.out.println("请输入需要被投票的人:");
20 String name=sc.next();
21 System.out.println("请输入"+name+"的起始票数:");
22 int num=sc.nextInt();
23 addvote(name,num);// 1:添加投票人
24 break;
25 case 2:
26 String me = readvote();// 2:查看投票
27 System.out.println(me);
28 break;
29 case 3:
30 editvote();// 3:投票
31 break;
32 case 4:
33 System.out.println("您已退出系统,谢谢使用!");
34 System.exit(0);
35 break;
36 default:
37 System.out.println("您输入的指令错误!");
38 break;
39 }
40 }
41 }
42 /*
43 * 查看投票
44 */
45 public static String readvote() throws Exception{
46 FileInputStream in = new FileInputStream("D:\\count.txt");
47 byte[] b = new byte[in.available()];
48 in.read(b);
49 message =new String(b);
50 in.close();
51 return message;
52 }
53 /*
54 * 添加投票
55 */
56 public static void addvote(String name,int num) throws
57 FileNotFoundException {
58 String SEPARATE_FIELD = "\n";// 换行
59 BufferedOutputStream out = null;
60 StringBuffer sbf = new StringBuffer();// 拼接内容
61 File file=new File("D:\\count.txt"); //判断文件是否存在
62 try {
63 // 当已存在count.txt文件,则在文件内容后追加
64 if (file.canExecute()) {
65 // 创建输出流,用于追加文件
66 out = new BufferedOutputStream(new
67 FileOutputStream("D:\\count.txt", true));
68 } else {// 不存在当天文件,则新建文件
69 // 创建输出流,用于保存文件
70 out = new BufferedOutputStream(new
71 FileOutputStream("D:\\count.txt"));
72 }
73 sbf.append(name).append(":");
74 sbf.append(num).append(","+SEPARATE_FIELD);
75 String str = sbf.toString();
76 byte[] b = str.getBytes();
77 for (int i = 0; i < b.length; i++) {
78 out.write(b[i]);// 将内容写入本地文件
79 }
80 } catch (Exception e) {
81 e.printStackTrace();
82 } finally {
83 try {
84 if (out != null)
85 out.close();// 关闭输出流
86 } catch (Exception e2) {
87 e2.printStackTrace();
88 }
89 }
90 }
91 /*
92 * 投票 将控制台输入的姓名的票数加一后保存
93 */
94 private static void editvote() throws Exception {
95 FileWriter out = null;
96 // 将count.txt文字根据“,”拆分成数组
97 String[] editMessage = message.split(",");
98 Scanner sc = new Scanner(System.in);
99 System.out.println("请输入要投票人的姓名");
100 String inputMessage = sc.next();
101 //for循环拆分后的数组
102 for (int i = 0; i < editMessage.length; i++) {
103 //当数组中有有包含输入的名字时
104 if(editMessage[i].contains(inputMessage)) {
105 //取出输入名字现在的票数
106 String a =
107 editMessage[i].substring(editMessage[i].indexOf(":")+1,
108 editMessage[i].length());
109 //将取出的票数强转为int类型
110 int b = Integer.parseInt(a);
111 //将票数+1
112 b++;
113 //new出一个StringBuffer用于后面的字符拼接
114 StringBuffer sb = new StringBuffer();
115 //取出原文件中的姓名和:
116 String c=editMessage[i].substring(0,editMessage[i].indexOf(":")+1);
117 //使用StringBuffer拼接姓名和选票
118 sb.append(c);
119 sb.append(b);
120 sb.append(",");
121 //将拼接后的字符强转为String类型
122 String s = sb.toString();
123 //修改好的字符替换原有的字符
124 System.out.println("投票后的票数:");
125 System.out.println(s);
126 editMessage[i] = s;
127 }
128 }
129 //editMessage是数组,我们需要将editMessage数组拼接为StringBuffer类型。
130 StringBuffer sb1 = new StringBuffer();
131 for (int i = 0; i < editMessage.length; i++) {
132 sb1.append(editMessage[i]);
133 }
134 out = new FileWriter("D:\\count.txt");//覆盖原有文件
135 //sb1是StringBuffer类型,需要使用toString()方法
136 out.write(sb1.toString());// 写入暂存的内容
137 out.close();
138 }
139 }