IO缓冲流

1.缓冲流的概述

  • 缓冲流也称为高效流,或者高级流.之前学习的字节流可以称为原始流;
  • 作用:缓冲流自带缓冲区,可以提高原始字节流,字节流读写数据的性能;

2.字符文件输入流

 //目标:学会字符文件输入流提高字符输入流的性能,新增了按照行读取的方法
    public static void main(String[] args) {
        try (
                //1.定义一个原始的字符输入流读取文字
                Reader fr = new FileReader("src/date01.txt");
                //a.把低级的字符输入流包装成缓冲字符输入流
                BufferedReader bfr = new BufferedReader(fr);
        ) {
            //3.缓冲字符输入流多了按照行读取数据的功能
            String line;
            while ((line= bfr.readLine())!=null){
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3. 字符文件输出流

  //1.创建一个字符输出流管道与目标文件接通
        BufferedWriter bfw=new BufferedWriter(new FileWriter("src/date.txt",true));
        //a.写一个字符
        bfw.write(97);
        bfw.write('男');
        bfw.write("徐");
        bfw.write("\r\n");//换行
        //b.写一个字符串出去
        bfw.write("黑马程序员");
        bfw.newLine();
       // bfw.write("\t\n");
        //c.写一个字符数组出去
        char[] buffer="我爱中国aaaa".toCharArray();
        bfw.write(buffer);
        bfw.newLine();
        //bfw.write("\r\n");//换行
        //d.写一部分字符串出去
        bfw.write(buffer,0,2);
        bfw.newLine();
        //bfw.write("\r\n");//换行
        //e.写一部分字符串出去
        bfw.write(buffer,2,2);
        bfw.newLine();
        //bfw.write("\r\n");//换行

        bfw.close();

3.不同编码之间读取乱码问题

  • 使用字符输入转换流
  • 可以提取文件(GBK)的原始字节流,原始字节不会存在问题
  • 然后把字节流以指定编码转换成字符输入流,这样字符输入流 中的字符就不会乱码了

4.字节输入转换流:InputStreamReader

  • 可以解决字符流读取不同编码乱码的问题
  • public InputStreamReader(InputStream is,String charset):可以指定编码把原始字节流转换成字符流,如此字符流中的字符不会乱码.
 try(
                //会乱码,编码语言不一样,编码UTF-8,文件编码GBK
                //1.提取原始文件的字节流(GBK字节流)
                InputStream is=new FileInputStream("C:\\ZM下载的内容\\11111.txt");
                //2.把字节输入流转换成字符输入流:使用字符输入流转换
                Reader isr=new InputStreamReader(is,"GBK");
                //3.把低级的字符输入流转换为缓冲字符流
                BufferedReader br=new BufferedReader(isr);
                ){
            String line;
            while ((line=br.readLine())!=null){
                System.out.print(line);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

5.字节输出转换流:OutputStreamReader

  • public OutputStreamReader(OutputStream os,String charset)可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码;
  try {
            //1.指定写出去的字符是:GBK
            OutputStream os=new FileOutputStream("src/date6.txt");
            //2.自己指定字节写出去
            //os.write("我爱中国".getBytes("GBK"));
            //3.新方案:把字符输出流指定编码转换成字符输出转换流
            OutputStreamWriter osw=new OutputStreamWriter(os,"GBK");
            BufferedWriter bw=new BufferedWriter(osw);
            bw.write("aaa哈哈哈");
            System.out.print("写入成功~~");
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

6.对象序列化

  • 以内存为基准,把内存中的对象存储到磁盘文件中去
  • 使用到的流是对象字节输出流:ObjectOutputStream

7.对象序列化:

把对象数据存入到文件中去,使用 对象字节输出流:ObjectOutputStream

序列化对象的要求是:对象必须实现序列化接口. 

 //创建一个学生对象
        Student st=new Student("张三","zhangsan",12345);
        //使用对象字节输出流
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("src/date01.txt"));
        oos.writeObject(st);
        oos.close();

8.对象反序列化

  • 对象字节输出流:ObjectOutputStream
  • 以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象;
 //创建一个对象字节输入流管道与源文件接通
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("src\\date01.txt"));
        Student st =(Student) ois.readObject();
        System.out.print(st);
        ois.close();
  • 注意:密码一般不进行序列化,这是应该对象中添加修饰符transient
  • 如果需要序列化多个对象,则使用List集合,List集合继承了Serializable
//使用transient修饰的变量将不再参与序列化!
    private transient int passWord;

 9.打印流

  • 打印流可以实现方便,高效的打印数据到文件中去.打印流一般指的是PrintStream,PrintWriter两个类
  • 可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印Boolean的true,写出去就是true

PrintStream,PrintWriter的区别

  • 打印数据功能上是一摸一样的,都是使用方便,性能高效(核心优势)
  • PrintStream继承字节输出流OutputStream,支持字节数据的方法
  • PrintWriter结成字符输出流Writer,支持写字符数据出去
//用来打印字节
        PrintStream ps=new PrintStream("src/date02.txt");
        //用来打印字符
        PrintWriter pw=new PrintWriter("src/date02.txt");
        //两者使用上没什么区别
        pw.print("我是张三");
        pw.print(97);
        pw.print('a');
        pw.print(90.3);
        pw.close();

9.打印流的重定向

改变系统的打印流成为自己的打印流,打印到指定文件中去

        //改变系统的打印流成为自己的打印流
        PrintStream ps=new PrintStream("src/date02.txt");
        System.setOut(ps);
        System.out.print(2222);

10.Properties属性集对象

其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用

Properties的核心作用是

  • Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去.
  • 属性文件:后缀是.properties结尾的文件,里面的内容都是key=value,后续做系统配置信息的

存入属性文件中键值对信息

   Properties pp=new Properties();
        pp.setProperty("admin","123456");
        pp.setProperty("张三","zhangsan01");
        System.out.print(pp);

        //存入到文件中去
        pp.store(new FileWriter("src/date02.properties"),"aaaaa");

从属性文件中读取键值对信息 

//需求:从属性文件中读取键值对信息
        Properties properties=new Properties();
        System.out.print(properties);
        //加载属性文件中的键值对信息到properties中
        properties.load(new FileReader("src/date02.properties"));
        System.out.println(properties.getProperty("admin"));
        //取所有键的值
        Set<String> keys=properties.stringPropertyNames();
        System.out.println(keys);

11.Properties的应用

 Properties properties=new Properties();
        //加载属性文件
        properties.load(new FileReader("src/date.txt"));
        //修改名字为秋雅的年龄为18岁
        if(properties.containsKey("秋雅")){
            properties.setProperty("秋雅","18");
        }
        //存入到文件中去
        properties.store(new FileWriter("src/date.txt"),"");

 12.Commons-IO框架

导入commons-io-2.6.jar做开发

需求:使用commons-io简化io流读写

  • 分析:
  • ①在项目中创建一个文件夹:lib
  • ②将commons-io-2.6.jar文件复制到lib文件夹
  • ③在jar文件上右键,选择add-as-Library->点击OK
  • ④在类中导包使用
 //1.完成文件复制
        IOUtils.copy(new FileInputStream("src/date01.txt"),
                new FileOutputStream("src/date011.txt"));
        //2.完成复制到文件夹下
        FileUtils.copyFileToDirectory(new File("C:\\ZM下载的内容\\积分告警需求.xlsx"),
                new File("C:\\YPP练习"));
        System.out.print("复制成功");
        //3.完成复制文件夹到文件夹
        FileUtils.copyDirectoryToDirectory(new File("C:\\YPP练习"),
                new File("C:\\YPP练习1"));
        FileUtils.deleteDirectory(new File("C:\\YPP练习1"));
        //4.JDK1.7开始 自己也做了一些一行代码就可以完成复制的操作:New IO的技术
        Files.copy(Path.of("C:\\YPP练习"),Path.of("C:\\YPP练习1"));

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值