JavaSE中级之IO流操作二

IO流操作文本文件和非文本文件

  • 对于文本文件的操作建议使用字符流来进行操作
  • 对于非文本文件建议使用字节流来进行操作
  • utf-8文件编码格式下,中文字符在底层实际占用3个字节

IO流操作文本文件--------字符流

FileReader-------->文件读操作(字符流)

  • IO流,数据库,网络资源操作完成后需要手动关闭,jvm没有办法自己关闭
  • 文件读操作对于程序来说是输入操作,是把外部文件内容输入到程序里面
单个字符循环读操作
  • 循环读取文件里面的内容
File file = new File("E:\\Java\\test.txt");
        FileReader fileReader = new FileReader(file);
        int read = fileReader.read();
        //方式1
        //System.out.println(read);
        while (read != -1) {
            System.out.println((char) read);
            read = fileReader.read();
        }
        //方式2
        /*int read1;
        while ((read1 = fileReader.read()) != -1) {
            System.out.println(read1);
        }*/
        //IO流,数据库,网络资源操作完成后需要手动关闭,jvm没有办法自己关闭
        fileReader.close();
字符串循环读操作
  • 利用String进行字符串循环读操作
File file = new File("E:\\Java\\test1.txt");
        FileReader fileReader = new FileReader(file);
        char[] chars = new char[5];
        int read = fileReader.read(chars);
        while (read != -1) {
            //System.out.println(read);
            //方式1
            /*for (int i = 0; i < read; i++) {
                System.out.println(chars[i]);
            }*/
            //方式2
            String s = new String(chars,0,read);
            System.out.println(s);
            read = fileReader.read(chars);
        }
        fileReader.close();

FileWriter-------->文件写操作(字符流)

  • 文件写操作对于程序来说是输出操作,是把程序里面的内容输出到外部文件里面

  • FileWriter(file),默认对文件进行追加写操作

  • FileWriter(file,false),对目标文件进行覆盖写操作

  • FileWriter(file,true),对文件进行追加写操作

单个字符循环写操作
File file = new File("E:\\Java\\fwtest.txt");
        FileWriter fileWriter = new FileWriter(file);
        //FileWriter fileWriter = new FileWriter(file,false);//对目标文件进行覆盖操作
        //FileWriter fileWriter = new FileWriter(file,true);//对文件进行追加操作
        //输出动作
        //一个一个字符输出
        String s = "hello word! 你好 世界,世界 你好 好好";
        for (int i = 0; i < s.length(); i++) {
            fileWriter.write(s.charAt(i));
        }
        fileWriter.close();
利用缓冲数组写操作
File file = new File("E:\\Java\\fwtest.txt");
        FileWriter fileWriter = new FileWriter(file);
        //FileWriter fileWriter = new FileWriter(file,false);//对目标文件进行覆盖操作
        //FileWriter fileWriter = new FileWriter(file,true);//对文件进行追加操作
        //输出动作
        //一个一个字符输出
        String s = "hello word! 你好 世界,世界 你好 好好";
        /*for (int i = 0; i < s.length(); i++) {
            fileWriter.write(s.charAt(i));
        }*/
        //利用缓冲数组
        char[] chars = s.toCharArray();
        fileWriter.write(chars);
        fileWriter.close();

文件与程序输入输出的区别

对文件来说

  • 从程序里面存内容到文件是输入操作
  • 从文件里面拿内容到程序里面是输出操作

对程序来说

  • 从程序里面存内容到文件是输出操作
  • 从文件里面拿内容到程序里面是是输入操作

FileReaderFileWriter结合的Copy操作

  • 对文件进行copy操作后要先关闭fileWriter流操作,然后再关闭FileReader流操作,所以 fileWriter.close();方法要写在 fileReader.close();前面
    • 简单来说就是先用先关,后用后关
方式一
  • 普通copy操作

    File file = new File("E:\\Java\\test1.txt");
            File file1 = new File("E:\\Java\\testCopy.txt");
            FileReader fileReader = new FileReader(file);
            FileWriter fileWriter = new FileWriter(file1);
            //Copy操作
            //方式1
            int read = fileReader.read();
            while (read != -1) {
                fileWriter.write(read);
                read = fileReader.read();
            }
            fileWriter.close();
            fileReader.close();
    
方式二
  • 利用缓冲数组进行copy操作

    File file = new File("E:\\Java\\test1.txt");
            File file1 = new File("E:\\Java\\testCopy.txt");
            FileReader fileReader = new FileReader(file);
            FileWriter fileWriter = new FileWriter(file1);
            //Copy操作
            //方式2    利用缓冲数组
            char[] chars = new char[5];
            int read = fileReader.read(chars);
            while (read != -1) {
                fileWriter.write(chars,0,read);
                read = fileReader.read(chars);
            }
            fileWriter.close();
            fileReader.close();
    
方式三
  • 把缓冲数组转为String进行copy操作

    File file = new File("E:\\Java\\test1.txt");
            File file1 = new File("E:\\Java\\testCopy.txt");
            FileReader fileReader = new FileReader(file);
            FileWriter fileWriter = new FileWriter(file1);
            //Copy操作
            //方式3 把缓冲数组转为String
            char[] chars = new char[5];
            int read = fileReader.read(chars);
            while (read != -1) {
                String s = new String(chars,0,read);
                fileWriter.write(s);
                read = fileReader.read(chars);
            }
            fileWriter.close();
            fileReader.close();
    

IO流操作非文本文件--------字节流

  • 字节流操作文本文件会把文本文件里面的内容拆成字节然后输出,所以不建议使用字节流操作文本文件

FileInputStream-------->文件读操作(字节流)

  • read()读取一个字节,返回的值是int类型,而不是byte类型
  • read()底层做了处理,让所有的返回值都的“正数”,避免了返回值为-1的情况,因为返回值为-1就难以区分是这个值是字节还是文件结尾
字节流操作文本文件
  • 字节流操作文本文件会把中文切割成字节,在utf-8文件编码格式下一个中文汉字占3个字节
  • 操作完后需要关闭流操作
File file = new File("E:\\Java\\test2.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        int sum = 0;
        int read = fileInputStream.read();
        //read()读取一个字节,返回的值是int,而不是byte
        //read底层做了处理,让所有的返回值都的“正数”,避免了返回值为-1的情况,避免了难以区分读入的到底是字节还是文件结尾
        //utf-8文件编码格式下,中文在底层实际占用3个字节
        while (read != -1) {
            sum ++;
            System.out.println(read);
            read = fileInputStream.read();
        }
        System.out.println(sum);
        fileInputStream.close();
字节流操作非文本文件
  • 把非文本文件的二进制信息以字节流形式输出
  • 操作完后需要关闭流操作
File file1 = new File("E:\\Java\\picTest.jpg");
        FileInputStream fileInputStream1 = new FileInputStream(file1);
        int count = 0;
        int read1 = fileInputStream1.read();
        while (read1 != -1) {
            count++;
            System.out.println(read1);
            read1 = fileInputStream1.read();
        }
        System.out.println(count);
        fileInputStream.close();
利用缓冲数组操作字节流
File file = new File("E:\\Java\\picTest.jpg");
        FileInputStream fileInputStream = new FileInputStream(file);
        //利用字节类型缓冲数组
        byte[] bytes = new byte[1024];
        int read = fileInputStream.read(bytes);
        while (read != -1) {
            //System.out.println(read);
            for (int i = 0; i < read; i++) {
                System.out.println(bytes[i]);
            }
            read = fileInputStream.read(bytes);
        }
        fileInputStream.close();

字节流对非文本文件的copy操作

  1. 方法1和方法2的时间差对比,明显方法2用时更短
  • 方法1
File file = new File("E:\\Java\\pic.jpg");
        File file1 = new File("E:\\Java\\picTest.jpg");

        FileInputStream fileInputStream = new FileInputStream(file);
        FileOutputStream fileOutputStream = new FileOutputStream(file1);

        long start = System.currentTimeMillis();//开始时间
        int read = fileInputStream.read();
        while (read != -1) {
            fileOutputStream.write(read);
            read = fileInputStream.read();
        }
        long end = System.currentTimeMillis();//结束时间
        System.out.println((end - start));

        fileOutputStream.close();
        fileInputStream.close();
  • 方法2
    • 利用缓冲数组
File file = new File("E:\\Java\\pic.jpg");
        File file1 = new File("E:\\Java\\picTest.jpg");

        FileInputStream fileInputStream = new FileInputStream(file);
        FileOutputStream fileOutputStream = new FileOutputStream(file1);

        long start = System.currentTimeMillis();
        byte[] bytes = new byte[1024*1024];
        int read = fileInputStream.read(bytes);
        while (read != -1) {
            fileOutputStream.write(bytes,0,read);
            read = fileInputStream.read();
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start));

        fileOutputStream.close();
        fileInputStream.close();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想写代码的懒大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值