java阶段八之文件IO流--------字符流&字节缓冲流------练习题

知识点

缓冲流,字符流 基础,练习

1.写出4个IO流中的抽象基类,4个文件流,4个缓冲流?
抽象基类:InputStream,OutputStream,Reader,Writer
文件流:FileInputStram,FileOutputSteam,FileReader,FileWriter
缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter

2.字节流与字符流的区别与使用情境?
字节流:读写数据是以字节为单位。可以复制任意文件的数据;
字符流:读写数据是以字符为单位,字节流+编码表=字符流。适用于文本文件;

3.转换流是哪两个类,分别的作用是什么?请分别创建两个类的对象。(注意是可以有字符集的那种)
转换流是InputStreamReader类和OutputStreamWriter类;InputStreamReamder的作用是字节流到字符流的桥梁,并使用指定的编码将字节解码为字符,有默认字符集,也可指定字符集;OutputStreamWriter的作用是从字符到字节的桥梁,使用指定的编码解码字符为字节,有默认字符集,也可指定字符集;

4.使用缓冲流实现a.jpg文件复制为b.jpg文件的操作

public class Work8_1_4 {
    public static void main(String[] args) throws IOException {
        //创建字节缓冲输入流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\a.jpg"));
        //创建字节缓冲输入流对象
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\itcast\\b.jpg"));
        //复制数据
        byte[] bys = new byte[1024];
        int len;
        while((len=bis.read(bys))!=-1){
            bos.write(bys,0,len);
            bos.flush();
        }
        //释放资源
        bis.close();
        bos.close();
    }
}

5.在指定的路径下新建一个 .txt 文件 “test.txt”,利用程序在文件中写入如下内容:

“Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于 1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有 卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科 学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互 联网的产业环境下,Java更具备了显著优势和广阔前景。”

并且成功读出在控制台打印,而且利用程序复制 test.txt 给 test1.txt

public class Work8_1_5 {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流对象用于test复制到test1
        BufferedReader br1 = new BufferedReader(new FileReader("E:\\itcast\\test.txt"));
        //创建字符缓冲输入流对象 用于写入数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\itcast\\test.txt"));
        BufferedWriter bw1 = new BufferedWriter(new FileWriter("E:\\itcast\\test1.txt"));

        //写入文本数据
        bw.write("Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言," +
                "是由Sun Microsystems公司于 1995年5月推出的Java程序设计语言和Java平台" +
                "(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有 卓越的通用性、高效性、" +
                "平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科 学超级计算机、" +
                "移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互" +
                "联网的产业环境下,Java更具备了显著优势和广阔前景。");
        bw.flush();

        //复制数据到test1中,并读数据输出在控制台
        String line;
        while((line=br1.readLine())!=null){
            bw1.write(line);
            System.out.print(line);
        }

        //释放资源
        br1.close();
        bw1.close();
        bw.close();


    }
}

6.利用IO流操作文件

  1. 利用java代码在D盘下创建一个mytemp文件夹
  2. 显示D盘下所有的.Java文件(没有可创建一个Hello.java做测试),包括D盘的子文件夹下的.java文件(利用递归)
  3. 给Hello.java文件里面随便写一些内容,然后把这个文件复制到mytemp文件夹中,名字也叫Hello.java
public class Work8_1_6 {
    public static void main(String[] args) throws IOException {
        //1)   利用java代码在D盘下创建一个mytemp文件夹
        File file = new File("D:\\mytemp");
        file.mkdir();
        File file1 = new File("D:\\Hello.java");
        file1.createNewFile();
        FileOutputStream fos = new FileOutputStream(file1);
        fos.write("你好!".getBytes());
        fos.flush();
        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos1 = new FileOutputStream("D:\\mytemp\\Hello.java");
        int len;
        byte[] bys = new byte[1024];
        while((len=fis.read(bys))!=-1){
//            fos1.write(bys,0,len);
            fos1.write(bys,0,len);
        }
        fos1.close();
        fis.close();
        fos.close();




        //2)   显示E盘下所有的.Java文件(没有可创建一个Hello.java做测试),包括E盘的子文件夹下的.java文件(利用递归)
        File file5 = new File("D:/");
        getAllJavaFile(file5);

    }

    public static void getAllJavaFile(File file) {
        File[] listFiles = file.listFiles();
        if (null == listFiles) {
            return;
        }
        for (File file1 : listFiles) {
            if (file1.isDirectory()) {
                getAllJavaFile(file1);
            } else {
                String fileName = file1.getName();
                //endWith判断字符串指定后几位的值
                if (fileName.endsWith(".java")) {
                    System.out.println(fileName);
                }

            }
        }
    }
}

7.重新完成 "File流练习0"中会出现乱码的题:编写程序向文本文件中写入自己的信息,格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,将该信息读出后显示的屏幕上后把文件删除。(如果出现问题,想一下会不会没有flush()方法,没有就算了~)

public class Work8_1_7 {
        public static void main(String[] args) throws IOException {
            Scanner scanner = new Scanner(System.in);
            //编写程序向文本文件中写入自己的信息,
            File file = new File("E:\\Work8_1_7\\myselfData.txt");
            //目的地
            FileOutputStream fos = new FileOutputStream(file);
            //数据源
            FileInputStream fis = new FileInputStream(file);
            System.out.println("请输入自己的姓名:");
            String name = scanner.next();
            name = "姓名:"+name;
            System.out.println("请输入自己的年龄:");
            String age = scanner.next();
            age = "年龄:"+age;
            System.out.println("请输入自己的性别:");
            String sex = scanner.next();
            sex = "性别:"+sex;
            System.out.println("请输入自己的班级:");
            String garde = scanner.next();
            garde = "班级:"+garde;
            //格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,
            fos.write(name.getBytes());
            fos.write("  ".getBytes());
            fos.write(age.getBytes());
            fos.write("  ".getBytes());
            fos.write(sex.getBytes());
            fos.write("  ".getBytes());
            fos.write(garde.getBytes());
            fos.write("  ".getBytes());
            fos.flush();
            System.out.println("成功!");
            //将该信息读出后显示的屏幕上后把文件删除。
            //将数据按一组一组数组读
            byte[] bytes = new byte[2048];
            //一个数组读取的实际字符个数
            int len;
            while ((len=fis.read(bytes)) != -1){
                System.out.print(new String(bytes,0,len));
            }
            //释放资源
            fos.close();
            fis.close();
            //必须在释放后删除!
            file.delete();
        }

}

8.(字符流)读取一个文本文件,每行都追加一个“好”,在文件结尾再追加“完毕”。

public class Work8_1_8 {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("E:\\itcast\\javase.txt"));
        //创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\itcast\\javase1.txt"));

        //读取一个文本文件,每行都追加一个“好”,在文件结尾再追加“完毕”。
        String line;
        while((line=br.readLine())!=null){
            //每行都追加一个“好”
            line=line+"好";
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //在文件结尾再追加“完毕”
        bw.write("完毕");
        bw.flush();

        //释放资源
        bw.close();
        br.close();


    }
}

9.使用Java的输入、输出流将一个文本文件的内容按行读出,每读出一行就顺序添加行号,并写入到另一个文件中。

public class Work8_1_9 {
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流
        BufferedReader br = new BufferedReader(new FileReader("E:\\itcast\\java.txt"));
        //创建字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\itcast\\java1.txt"));
        //更改数据并复制
        String line;
        int num = 0;
        char[] chs = new char[1024];
        while ((line = br.readLine()) != null) {
            //每行添加添加序号
            line = ++num + ":" + line;
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //释放资源
        bw.close();
        br.close();
    }
}

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

(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疾风剑豪

.********************

-------》程序运行如下:
(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 分。

public class Work8_1_10 {
    static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) throws IOException {
        //创建字符缓冲输入流
        BufferedReader br = new BufferedReader(new FileReader("E:\\itcast\\试题文件.txt"));
        //读取一行数据
        String line;
        //总积分
        int sum = 0;
        //答案数组 博主并不知道正确答案,此处乱写的 
        char[] chs = {'A', 'D', 'D', 'B', 'C'};
        //答案索引
        int i = 0;
        while ((line = br.readLine()) != null) {
            //每次显示试题文件中的一道题目
            System.out.println(line);
            //读取到字符“*”时暂停读取
            if (line.contains("*****")) {
                System.out.println("输入选择的答案(A、B、C、D):");
                //等待用户从键盘输入答案
                char c = isValueAnswer();
                if (c == chs[i++]) {
                    sum += 20;
                }
            }
        }
        System.out.println("恭喜你获得" + sum + "分!");
        //释放资源
        br.close();

    }

    public static char isValueAnswer() {
        String answer;
        boolean flag=true;
        char c=' ';
        while(flag){
            try {
                answer = scanner.next();
                if (answer.length() > 1) {
                    throw new Exception("请输入长度为1的答案:");
                } else {
                     c = answer.toUpperCase().charAt(0);
                    if (c<'A' || c>'D'){
                        throw new Exception("请输入A-D之间:");
                    }else{
                        flag =false;
                        break;
                    }
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return c;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值