【介绍】
1.任务描述
如今微信聊天已经普及到几乎每一个人,在聊天中,经常会有人需要帮忙在某个APP中投票。
要求:编写一个模拟微信投票的程序,通过在控制台输入指令,实现添加候选人、查看当前投票和投票的功能。每个功能的具体要求如下。
(1) 用户输入指令1代表”添加候选人”,可以在本地文件中添加被选举人。
(2) 用户输入指令2代表”查看当前投票”,将本地文件中的数据打印到控制台。
(3) 用户输入指令3 代表”投票”功能,在控制台输入被投票人的名字进行投票操作。
(4) 用户输入指令4代表”退出”操作。
2.运行结果
【思路】
(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文件
(5) 输入指令4,直接退出系统,可以通过代码”System.exit(0);”实现。
package chapter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.Scanner;
class vote {
private static String message = "";
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("1:添加候选人 2:查看当前投票 3:投票 4:退出");
while (true) {
System.out.print("请输入操作指令:");
int command = sc.nextInt();
switch (command) {
case 1:
System.out.println("请输入需要被投票的人:");
String name=sc.next();
System.out.println("请输入"+name+"的起始票数:");
int num=sc.nextInt();
addvote(name,num);// 1:添加投票人
break;
case 2:
String me = readvote();// 2:查看投票
System.out.println(me);
break;
case 3:
editvote();// 3:投票
break;
case 4:
System.out.println("您已退出系统,谢谢使用!");
System.exit(0);
break;
default:
System.out.println("您输入的指令错误!");
break;
}
}
}
/*
* 查看投票
*/
public static String readvote() throws Exception{
FileInputStream in = new FileInputStream("D:\\count.txt");
byte[] b = new byte[in.available()];
in.read(b);
message =new String(b);
in.close();
return message;
}
/*
* 添加投票
*/
public static void addvote(String name,int num) throws
FileNotFoundException {
String SEPARATE_FIELD = "\n";// 换行
BufferedOutputStream out = null;
StringBuffer sbf = new StringBuffer();// 拼接内容
File file=new File("D:\\count.txt"); //判断文件是否存在
try {
// 当已存在count.txt文件,则在文件内容后追加
if (file.canExecute()) {
// 创建输出流,用于追加文件
out = new BufferedOutputStream(new
FileOutputStream("D:\\count.txt", true));
} else {// 不存在当天文件,则新建文件
// 创建输出流,用于保存文件
out = new BufferedOutputStream(new
FileOutputStream("D:\\count.txt"));
}
sbf.append(name).append(":");
sbf.append(num).append(","+SEPARATE_FIELD);
String str = sbf.toString();
byte[] b = str.getBytes();
for (int i = 0; i < b.length; i++) {
out.write(b[i]);// 将内容写入本地文件
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();// 关闭输出流
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/*
* 投票 将控制台输入的姓名的票数加一后保存
*/
private static void editvote() throws Exception {
FileWriter out = null;
// 将count.txt文字根据“,”拆分成数组
String[] editMessage = message.split(",");
Scanner sc = new Scanner(System.in);
System.out.println("请输入要投票人的姓名");
String inputMessage = sc.next();
//for循环拆分后的数组
for (int i = 0; i < editMessage.length; i++) {
//当数组中有有包含输入的名字时
if(editMessage[i].contains(inputMessage)) {
//取出输入名字现在的票数
String a =
editMessage[i].substring(editMessage[i].indexOf(":")+1,
editMessage[i].length());
//将取出的票数强转为int类型
int b = Integer.parseInt(a);
//将票数+1
b++;
//new出一个StringBuffer用于后面的字符拼接
StringBuffer sb = new StringBuffer();
//取出原文件中的姓名和:
String c=editMessage[i].substring(0,editMessage[i].indexOf(":")+1);
//使用StringBuffer拼接姓名和选票
sb.append(c);
sb.append(b);
sb.append(",");
//将拼接后的字符强转为String类型
String s = sb.toString();
//修改好的字符替换原有的字符
System.out.println("投票后的票数:");
System.out.println(s);
editMessage[i] = s;
}
}
//editMessage是数组,我们需要将editMessage数组拼接为StringBuffer类型。
StringBuffer sb1 = new StringBuffer();
for (int i = 0; i < editMessage.length; i++) {
sb1.append(editMessage[i]);
}
out = new FileWriter("D:\\count.txt");//覆盖原有文件
//sb1是StringBuffer类型,需要使用toString()方法
out.write(sb1.toString());// 写入暂存的内容
out.close();
}
}