前言

        学完IO流之后不知道大家有没有一个感觉,就是我们之前写的代码他的数据都是无法保存的,那么我们学完IO之后我们可以将我们的程序运行记录到文件当中给他永久保存,大大提高了我们的程序效率,相应地就是我们可以使用文件当中的数据来完成我们的需求,接下来就让我们进入代码的世界吧,一起看看这道题。


目录

一、题目要求

二、思路实现

三、注意事项


一、题目要求

3.(实践题)使用输入流读取试题文件,每次显示试题文件中的一道题目。读取到字符“*”时暂停读取,等待用户从键盘输入答案。用户做完全部题目后。程序给出用户的得分(10分一道题)。


1)    试题内容如下:
(1)英雄联盟S9全球总决赛是什么时间开幕的?D
    A.2018-08-08  B. 2018-08-01 
    C.2019-10-01 D. 2019-10-02
********************
(2)下列哪个英雄不属于《英雄联盟》?D
   A.卡特  B.盲僧 C.剑豪  D.后羿
********************
(3).以下哪一句不是疾风剑豪亚索的台词?C
    A.死亡如风,常伴吾身。B.面对疾风吧!C.真正的大师,永远都怀着一颗学徒的心。D.哈塞给!
********************
(4).英雄联盟世界S赛被OMG基地50血翻盘的战队是?C
    A.SKT B.Najin C.FNC D.G2
********************
(5)英雄联盟中,戏称最争气的英雄是?D
    A迅捷斥候  B蒸汽机器人  C德玛西亚之力  D疾风剑豪
********************


-------》程序运行如下:
(1)英雄联盟S9全球总决赛是什么时间开幕的?
A.2018-08-08  B. 2018-08-01 
C.2019-10-01 D. 2019-10-02
输入选择的答案(A、B、C、D):D
(2)下列哪个英雄不属于《英雄联盟》?
   A.卡特  B.盲僧 C.剑豪  D.后羿
输入选择的答案(A、B、C、D):D
...
...

完成试题,恭喜你 你最后的得分为:20 分。
 

二、思路实现

        首先看到这道题我们应该就想到把题目先复制到一个TXT文件中去。

        第二步应该创建缓冲输入流读取文件中的题目,然后题目有一个要求,读到星号的时候暂停读取,让用户输入,即一个if语句。

        第三步我们应该定义一个答案,一个记分用的int类型的变量,答对给10分即可。

        第四步就是输出最后结果即可。

        那么讲完思路,我们就应该来写代码了,首先第一步我们先把题目写进txt文件当中,这里的例子采用的是英雄联盟的答题,你对什么感兴趣,你也可以设计不同的题目。

        (1)英雄联盟S9全球总决赛是什么时间开幕的?
    A.2018-08-08  B. 2018-08-01 
    C.2019-10-01 D. 2019-10-02
********************
(2)下列哪个英雄不属于《英雄联盟》?
   A.卡特  B.盲僧 C.剑豪  D.后羿
********************
(3).以下哪一句不是疾风剑豪亚索的台词?
    A.死亡如风,常伴吾身。B.面对疾风吧!C.真正的大师,永远都怀着一颗学徒的心。D.哈塞给!
********************
(4).英雄联盟世界S赛被OMG基地50血翻盘的战队是?
    A.SKT B.Najin C.FNC D.G2
********************
(5)英雄联盟中,戏称最争气的英雄是?
    A迅捷斥候  B蒸汽机器人  C德玛西亚之力  D疾风剑豪
********************

        题目如上。

        第二步创建输入流读取数据。

 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\IO文件作业示例\\源文件\\TestLoL\\LOL.txt"),"GBK"));
        StringBuilder cho = new StringBuilder();
        Scanner sc = new Scanner(System.in);

        代码中为何使用了字节输入流的构造方法原因我会在注意事项中阐明。

        接下来就是读取,怎么读取一道题就等用户输入答案呢?很简单,我们在读取到星号时,采用if语句判断他如果以星号开始,那么就进入用户答题界面,不是星号我们就输出我们流读取到的数据,并且这里我们采用字符缓冲流的特殊方法readLine方法。

        

 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\IO文件作业示例\\源文件\\TestLoL\\LOL.txt"),"GBK"));
        StringBuilder cho = new StringBuilder();
        Scanner sc = new Scanner(System.in);
        //题目答案
        String answer = "DDCCD";

        String line;
        while ((line = br.readLine()) != null) {
            br.lines();
            if (!line.startsWith("*")) {
                System.out.println(line);

            }else {
                System.out.println("输入选择的答案(A、B、C、D):");
                String choice = sc.next();
                cho.append(choice.charAt(0));
            }
        }

         这里我采用了StringBuilder去拼接答案,当然你也可以使用数组。

        答案我们使用的是String变量存储,答案我也用StringBuilder去接收拼接。

        接下来就是将我们得到的答案字符串与我们实现定好的答案字符串进行比对

 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\IO文件作业示例\\源文件\\TestLoL\\LOL.txt"),"GBK"));
        StringBuilder cho = new StringBuilder();
        Scanner sc = new Scanner(System.in);
        //题目答案
        String answer = "DDCCD";
        String result = null;

        String line;
        while ((line = br.readLine()) != null) {
            br.lines();
            if (!line.startsWith("*")) {
                System.out.println(line);

            }else {
                System.out.println("输入选择的答案(A、B、C、D):");
                String choice = sc.next();
                result =  cho.append(choice.charAt(0)).toString();
            }
        }

        int sum = 0;
         for(int i =0;i<result.length();i++) {
             if(result.charAt(i) == answer.charAt(i)) {
                 sum+=10;
             }
         }
        System.out.println("完成试题,恭喜你 你最后的得分为:" + sum + "分。");
        br.close();
    }
}

以上我们整个程序就已经写完。

最后来看看运行情况

 (1)英雄联盟S9全球总决赛是什么时间开幕的?
    A.2018-08-08  B. 2018-08-01 
    C.2019-10-01 D. 2019-10-02
输入选择的答案(A、B、C、D):
D
(2)下列哪个英雄不属于《英雄联盟》?
   A.卡特  B.盲僧 C.剑豪  D.后羿
输入选择的答案(A、B、C、D):
D
(3).以下哪一句不是疾风剑豪亚索的台词?
    A.死亡如风,常伴吾身。B.面对疾风吧!C.真正的大师,永远都怀着一颗学徒的心。D.哈塞给!
输入选择的答案(A、B、C、D):
C
(4).英雄联盟世界S赛被OMG基地50血翻盘的战队是?
    A.SKT B.Najin C.FNC D.G2
输入选择的答案(A、B、C、D):
C
(5)英雄联盟中,戏称最争气的英雄是?
    A迅捷斥候  B蒸汽机器人  C德玛西亚之力  D疾风剑豪
输入选择的答案(A、B、C、D):
D
完成试题,恭喜你 你最后的得分为:50分。

(1)英雄联盟S9全球总决赛是什么时间开幕的?
    A.2018-08-08  B. 2018-08-01 
    C.2019-10-01 D. 2019-10-02
输入选择的答案(A、B、C、D):
D
(2)下列哪个英雄不属于《英雄联盟》?
   A.卡特  B.盲僧 C.剑豪  D.后羿
输入选择的答案(A、B、C、D):
D
(3).以下哪一句不是疾风剑豪亚索的台词?
    A.死亡如风,常伴吾身。B.面对疾风吧!C.真正的大师,永远都怀着一颗学徒的心。D.哈塞给!
输入选择的答案(A、B、C、D):
D
(4).英雄联盟世界S赛被OMG基地50血翻盘的战队是?
    A.SKT B.Najin C.FNC D.G2
输入选择的答案(A、B、C、D):
D
(5)英雄联盟中,戏称最争气的英雄是?
    A迅捷斥候  B蒸汽机器人  C德玛西亚之力  D疾风剑豪
输入选择的答案(A、B、C、D):
D
完成试题,恭喜你 你最后的得分为:30分。

         如果你要显示那题对了哪一题错了有兴趣可以自己写进去哦。

三、注意事项

        这题需要注意的就是乱码问题

      字符乱码的问题,在第二部分第一步我用了一个缓冲输入流的父类的构造方法去指定字符编码集,至于编码集的问题大家可以参考我上一篇关于IO流的内容,如果我用了以下代码

  BufferedReader br = new BufferedReader(new FileReader("E:\\IO文件作业示例\\源文件\\TestLoL\\LOL.txt"));

        那么输出结果就会是这样

        (1)Ӣ������S9ȫ���ܾ�����ʲôʱ�俪Ļ�ģ�
    A.2018-08-08  B. 2018-08-01 
    C.2019-10-01 D. 2019-10-02
输入选择的答案(A、B、C、D):
d
(2)�����ĸ�Ӣ�۲����ڡ�Ӣ�����ˡ���
   A.����  B.äɮ C.����  D.����
输入选择的答案(A、B、C、D):

        那关于中文的部分就全部变成了乱码,造成这个问题就是我们中文字符编码集的问题,出现这种问题我们直接去指定编码集即可,例如UTF-8。


本文转载:CSDN博客