1、转换流InputStreamReader;OutputStreamWriter
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("./txt")))); BufferedWriter bufferedWriter =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("./i.txt"))));
编码:字符串--->字节数组
解码:字节数组--->字符串
字节流的数据是字符时,转换成字符流更高效
InputStreamReader:用于将字节流解码成字符
OutputStreamWriter:将字节流中的字符按指定的字符集编码成字节
从键盘输入字符串,要求将读取到的整行字符串转换成大写输出,
然后继续进行输入操作,
直至输入e或者exit时推出程序
import java.io.*; public class Test819 { public static void main(String[] args) { BufferedReader bufferedReader=null; try { bufferedReader = new BufferedReader(new InputStreamReader(System.in)); while(true){ String s=bufferedReader.readLine().toUpperCase(); if (s.equals("E")||s.equals("EXIT")){ System.out.println("退出"); return; } System.out.println(s); } } catch (Exception e) { e.printStackTrace(); }finally { try {//关闭连接,好习惯 bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
dsds
DSDS
dsds
DSDS
gtgt
GTGT
hyhy
HYHY
e
退出
************************大练习********************************************
项目4:考试管理软件 目标 •仿真实现一个基于文本界面的考试管理系统 •增量式开发,循序渐进完成项目 •建立查看使用API文档的习惯 •掌握编程技巧和调试技巧 •主要涉及以下主要知识点: –基础API –集合的存储与遍历 –I/O流基础知识 –I/O流的链接 –将散装数据合成对象 –控制台I/O 需求说明 •仿真实现基于文本界面的考试管理系统。 •应提供机上考试功能,并且能够自动判分。 •能够自动记录最后一次考试成绩。 •应尽量做到界面友好,操作方便。 •可选步骤,能够查询显示最后一次考试的答题情况和成绩。 软件设计结构 第1步 —使用基本I/O流读取文本文件 1.在IDE(例如eclipse)中创建Exam项目,在该项目下完成后续步骤。 2.编写ItemService类,提供public void readTextFile(String fileName)方法,该方法可读取参数指定的文本文件内容 (不使用包装) ,并打印输出到屏幕上; 3.Exam类的main方法中,创建ItemService对象并调用 readTextFile方法,来打印输出指定文本文件内容 第2步 —使用流的链接读取文本文件 1.改进ItemService类的readTextFile方法: public List<String> readTextFile(String filename),该方法使用流的链接,以文本行的方式读取参数指定的文本文件内容,并放置到集合中以作为该方法的返回值; 2.Exam类的main方法中,创建ItemService对象并调用 readTextFile方法,接收方法返回的List集合,在屏幕上打印集合内容。 知识点 — 将散装数据合成对象 •通常需要将文件中读取的内容封装到指定类型的对象中,以便于程序处理。 •例如:读取Teacher.txt中的数据,用来创建Teacher对象。 Teacher.txt文件内容如下: 张三 男 30 六班 第3步 —将散装数据合成对象 1.制作包含10道选择题的文本文件,选择题内容包括题目、4个选项和标准答案(均为单选); 2.定义题目Item类,属性与上述单选题对应,并提供对应的get/set方法; 3.在ItemService类中声明实例变量Item[] items;将ItemService类的readTextFile方法改为私有方法; 4.在ItemService 类中添加构造器,构造器中调用 readTextFile方法,将方法返回的字符串集合组装为 Item对象,并将所有 Item对象以数组形式保存在 items实例变量中; 5.添加getItem方法: public Item getItem(int no),该方法返回 ItemService中保存的由参数no指定的 Item对象; 6.Exam类的main方法中调用 getItem方法,接收方法返回的Item对象,在屏幕上打印对象。 第4步 —使用流的链接写入文本文件 1.在ItemService类中添加saveAnswer方法: public void saveAnswer(char[] answer),该方法创建answer.dat二进制文件,并将数组中的内容以对象形式写入到文件中保存; 提示:使用对象序列化机制 2.在Exam类的main方法中调用 saveAnswer方法,测试是否正常工作。 第5步 — 访问键盘设备 1.编写ExamView类,声明getUserAction方法:public char getUserAction(),在方法中读取键盘键入值(每次只取键入序列的第一个键值),判断键值应为a、b、c、d、n、p键(包括大小写)值之一时,将其作为方法返回值,否则忽略不计; 2.在Exam类的main方法中调用重复(循环)调用getUserAction方法,打印返回值,直到程序结束运行。 第6步 — 完善业务功能(一) 1.在ExamView类中,声明displayItem方法:public void displayItem(int no),该方法显示参数no指定的考题内容; 2.在ExamView类,声明testExam方法:public void testExam(),在方法中: –初始时,调用 displayItem显示考题第1题; –调用 getUserAction方法,判断当用户键入n时,显示下一题;当用户键入p时,显示上一题(如果当前不是第1题时); –在当前为最后一题时键入n,方法结束并返回。 3.在Exam类的main方法中调用 testExam方法,验证结果。 第7步 — 完善业务功能(二) 1.在ExamView类中,定义char[] answer属性,改进testExam方法,在原基础上: 1.调用 getUserAction方法,判断当用户键入a、b、c、d中的任意键时,将其记为当前题目的答案(记入 answer数组中); 2.在显示最后一题时键入n,方法结束, 调用ItemService中的saveAnswer保存所有答案,并返回。 2.在Exam类的main方法中调用 ExamView类的testExam方法,测试题目显示及按键操作是否正确。 第8步 — 进阶业务功能 1.在ExamView类中,继续改进testExam方法,在原基础上: 1.起始进入考试时,首先显示一页“帮助信息”,用来说明考试过程中的操作方法,尤其是各按键的使用。当键入n时,显示第一道题; 2.在显示每题题目的同时,如果之前考生已经选择了该题目的答案,则答案也同时显示以便考生查看; 3.键入f表示结束考试,程序应提示用户进行确认。如确认则自动判分,并调用ItemService中的saveAnswer保存所有答案及分数,并显示所有考题的正确答案和考生所选答案,以及考试分数,然后方法结束。如果不确认,则继续答题。 2.在Exam类的main方法中调用 ExamView类的testExam方法,验证程序是否正确运行。 第9步 — 进阶业务功能 1.添加以下功能:程序启动时,显示主菜单,菜单包含以下两项: 1.进入考试 2.显示上次考试成绩 2.当用户选择1时,进入考试过程;当用户选择2时,显示上次考试成绩,按n键后回到主菜单。
package com.Exam; import java.io.*; import java.util.ArrayList; import java.util.List; public class ItemService { private static final String ITEM_FILENAME = "./item.txt"; private static final String ANSWER_FILENAME = "./answer.txt"; public final int ITEM_NUMS;//一共有多少题 private final int LINE = 6; public Item[] items; public ItemService() { //将所有的本地文件读取到items中 List<String> list = readTextFile(); ITEM_NUMS = list.size()/6; items = new Item[ITEM_NUMS]; for(int i=0;i<ITEM_NUMS;i++) { String question = list.get(i*LINE); String[] options = {list.get(i*LINE+1),list.get(i*LINE+2),list.get(i*LINE+3),list.get(i*LINE+4)}; char answer = list.get(i*LINE+5).charAt(0); Item item = new Item(question,options,answer); items[i] = item; } System.out.println(items); } public List<String> readTextFile() { //读取文件到List集合中,方便读取到item到items数组 List<String> list = new ArrayList<>(); BufferedReader buffReader = null; try { buffReader= new BufferedReader(new FileReader(ITEM_FILENAME)); String str = null; while((str=buffReader.readLine())!=null) { if(!str.trim().equals("")) { list.add(str); } } } catch (Exception e) { e.printStackTrace(); } finally { if(buffReader!=null) { try { //关闭I/O流,好习惯 buffReader.close(); } catch (IOException e) { e.printStackTrace(); } } } return list; } //获取一个item条目 public Item getItem(int index) { System.out.println(index); if(index<1||index>ITEM_NUMS) { return null; } //itemS里存放的是所有题目的集合,方便提取 return items[index-1]; } //将学生答题的答案序列化到本地 public void saveAnswer(char[] arr) { ObjectOutputStream obj = null; try { obj= new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File(ANSWER_FILENAME)))); obj.writeObject(arr); } catch (Exception e) { } finally { if(obj!=null) { try { obj.close(); } catch (IOException e) { e.printStackTrace(); } } } } //读取序列化到本地的学生答题答案 public char[] readAnswer() { char[] arr = null; ObjectInputStream obj = null; try { FileInputStream in = new FileInputStream(ANSWER_FILENAME); BufferedInputStream buff = new BufferedInputStream(in); obj = new ObjectInputStream(buff); arr = (char[]) obj.readObject(); } catch (Exception e) { } finally { if(obj!=null) { try { obj.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return arr; } }
package com.Exam; import java.io.Serializable; import java.util.Arrays; public class Item implements Serializable{ private String question;//题干 private String[] options;//四个选项 private char answer;//答案 public Item(String question, String[] options, char answer) { super(); this.question = question; this.options = options; this.answer = answer; } public Item() { super(); } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String[] getOptions() { return options; } public void setOptions(String[] options) { this.options = options; } public char getAnswer() { return answer; } public void setAnswer(char answer) { this.answer = answer; } }
package com.Exam; import java.util.Scanner; public class ExamView { private ItemService item = new ItemService(); private char[] answer; public ExamView() { answer = new char[item.ITEM_NUMS]; } public static void main(String[] args) { ExamView e = new ExamView(); e.enterMainMenu(); } public void enterMainMenu() { displayMainMenu(); char key = getUserAction(); switch (key) { case '1': //进入考试 textExam(); break; case '2': //查看成绩 reviewAnswer(); break; case '3': System.out.println("退出系统"); return; default: break; } } public void textExam() { welcomeExamInfo(); int currItemNum = 1; while(true) { Item i = item.getItem(currItemNum); System.out.println(i.getQuestion()); String[] options = i.getOptions(); for(int f=0;f<options.length;f++) { System.out.println(options[f]); } System.out.println("请选择:"); char c = getUserAction(); switch (c) { case 'A': case 'B': case 'C': case 'D': answer[currItemNum-1] = c; if(currItemNum>=item.ITEM_NUMS) { resultAnswer(answer); return; } currItemNum++; break; case 'N': if(currItemNum>=item.ITEM_NUMS) { System.out.println("已经是最后一个题了!"); }else { currItemNum++; } break; case 'P': if(currItemNum<=1) { System.out.println("已经达到第一个题了!"); }else { currItemNum--; } break; case 'F': System.out.println("确认是否结束考试(Y/N)"); char k = getUserAction(); if(k=='Y') { //保存答案 item.saveAnswer(answer); //自动判分 resultAnswer(answer); //将答案序列化到本地 item.saveAnswer(answer); return;//结束考试 }else if(k=='N'){ currItemNum--; } break; default: break; } } } //进入项目提示信息 public void welcomeExamInfo() { System.out.println("-------------------"); System.out.println("-------------------"); System.out.println("---欢迎进入考试----"); System.out.println("-------------------"); System.out.println("---请按照一下要求进行考试----"); System.out.println("-------------------"); System.out.println("---A-D 选择指定答案---"); System.out.println("-------------------"); System.out.println("---P 显示上一题--"); System.out.println("---N 显示下一题--"); System.out.println("---F 考试结束--"); System.out.println("--请按N键进入考试-"); System.out.println("-------------------"); while(true) { char c = getUserAction(); if(c=='N') { return; } } } //传入用户的答案, public void resultAnswer(char[] answer) { int score = 0; Item[] items = item.items; for(int i=0;i<item.ITEM_NUMS;i++) { Item it =items[i]; //获取准确答案an,和用户的答案进行对比 char an = it.getAnswer(); if(an==answer[i]) { score+=10; } } System.out.println("您的最终得分是:"+score); } //获取本地用户答案 public void reviewAnswer() { //调用对答案方法,获取成绩 resultAnswer(item.readAnswer()); } //获取输入,规定对应的输入 public char getUserAction() { char[] arr = {'1','2','3','A','B','C','D','N','P','F','Y'}; while(true) { Scanner scan = new Scanner(System.in); String s = scan.next().toUpperCase(); char c = s.charAt(0); for(char r:arr) { if(c==r) { return c; } } System.out.println("请继续输入:"); } } //显示功能,提示 public void displayMainMenu() { System.out.println("--------------------------"); System.out.println("--------------------------"); System.out.println("--------------------------"); System.out.println("----欢迎使用在线考试系统--------------------"); System.out.println("--------------------------"); System.out.println("--------------------------"); System.out.println(" 1 进入考试"); System.out.println(" 2 查看成绩"); System.out.println(" 3 退出系统"); System.out.println("--------------------------"); System.out.println("--------------------------"); System.out.println("--请选择:--"); } }