• 【Java基础】IO流(二)


    个人简介

    > 📦个人主页:是Lay的主页
    > 🏆学习方向:JAVA后端开发 
    > 📣种一棵树最好的时间是十年前,其次是现在!
    > ⏰往期文章:【Java基础】File类 IO流
    > 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

    目录 

    1. 字符流

      1.1 字符输入流Reader

      1.2 字符输出流Writer

     2. 缓冲流

      2.1 缓冲流概述、字节缓冲流的使用

      2.2 字节缓冲流的性能分析

      2.3 字符缓冲流

     3. 转换流

       3.1 不同编码读取乱码问题

       3.2 字符输入转换流

       3.3 字符输出转换流

     4. 序列化对象

        4.1 对象序列化

        4.2 对象反序列化

     5. 打印流

        5.1 PrintStream、PrintWriter

        5.2 输出语句的重定向

     6. 补充知识: Proparties

            6.1 Properties的作用

     7. 补充知识: IO框架

            7.1 commons-io概述

             7.2 FileUtils主要有如下方法

    1. 字符流

      1.1 字符输入流Reader

            Reader--抽象父类--不能实例化

            FileReader--文件字符输入流-FR

            BufferedReader--高效字符输入流-BR

        FR in = new FR(new File(路径));
        FR in = new FR(路径);
        BR in = new BR(new FR(new File(路径)))
        BR in = new BR(new FR(路径));

      1.2 字符输出流Writer

            Writer--抽象父类,不能实例化

            FileWriter--文件字符输出流--FW

            BufferedWriter--高效字符输出流--BW

        FW out = new FW(File/File,append/String pathname/String pathname,append);
        BW out = new BW(Writer--所以传的是子类FW(上面那4种));
        注意:这里的append参数表示流向文件输出数据的时候是追加还是覆盖,如果不写,默认false是覆盖,如果改为true,表示追加

     2. 缓冲流

      2.1 缓冲流概述、字节缓冲流的使用

            2.1.1 缓冲流概述

                    缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。

                    作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能

            2.1.2 字节缓冲流性能优化原理:

                    字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。                 字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。

            2.1.3 字节缓冲流  

                    字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。  

                    字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。

            2.1.4 缓冲流有几种?

                    字节缓冲流 字节缓冲输入流: BufferedInputStream  

                    字节缓冲输出流:BufferedOutputStream

                    字符缓冲流 字符缓冲输入流:BufferedReader

                    字符缓冲输出流:BufferedWriter

            2.1.5 字节缓冲流为什么提高了操作数据的性能?

                    字节缓冲流自带8KB缓冲区

                    可以提高原始字节流、字符流读写数据的性能

            2.1.6 字节缓冲流的功能如何调用?

                    public BufferedOutputStream​(OutputStream os)

                    public BufferedInputStream​(InputStream is)

                    功能上并无很大变化,性能提升了。

      2.2 字节缓冲流的性能分析

            2.2.1 如何测试字节缓冲流的读写性能?

                需求

                    分别使用低级字节流和高级字节缓冲流拷贝大视频,记录耗时。

                分析

                    使用低级的字节流按照一个一个字节的形式复制文件。

                    使用低级的字节流按照一个一个字节数组的形式复制文件。

                    使用高级的缓冲字节流按照一个一个字节的形式复制文件。

                    使用高级的缓冲字节流按照一个一个字节数组的形式复制文件。 

    1. /**
    2. * 使用高级的缓冲字节流按照一个一个字节数组的形式复制文件
    3. */
    4. private static void copy(){
    5. long startTime = System.currentTimeMillis();
    6. try(
    7. //这里只能放置资源对象,用完会自动关闭,自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作)
    8. //1.创建一个字节输入流管道与原图片接通
    9. InputStream is =new FileInputStream(SRC_FILE);
    10. //a.把原始的字节输入流包装成高级的缓冲字节输入流
    11. InputStream bis =new BufferedInputStream(is);
    12. //2.创建一个字节输出流`管道与目标图片接通
    13. OutputStream os =new FileOutputStream(DEST_FILE+"video4.mp4");
    14. //b.把字节输出流管道包装成高级的缓冲字节输出流管道
    15. OutputStream bos =new BufferedOutputStream(os);
    16. ) {
    17. //3.定义一个字节数组转移数据
    18. byte[] buffer = new byte[1024];
    19. int len;//记录每次读取的字节数
    20. while ((len = bis.read(buffer)) != -1 ){
    21. bos.write(buffer,0,len);
    22. }
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. }
    26. long endTime = System.currentTimeMillis();
    27. System.out.println("使用缓冲的字节流按照一个一个字节数组的形式复制文件耗时:"+(endTime - startTime)/1000.0+"s");
    28. }

            2.2.2  推荐使用哪种方式提高字节流读写数据的性能?

                    建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。

      2.3 字符缓冲流

            2.3.1 字符缓冲流为什么提高了操作数据的性能?

                    字符缓冲流自带8K缓冲区

                    可以提高原始字符流读写数据的性能

            2.3.2 字符缓冲流的功能如何使用?

                    public BufferedReader​(Reader r)

                    性能提升了,多了readLine()按照行读取的功能

                    public BufferedWriter​(Writer w)

                    性能提升了,多了newLine()换行的功能

     3. 转换流

       3.1 不同编码读取乱码问题

            3.1.1 之前我们使用字符流读取中文是否有乱码?

                    没有的,因为代码编码和文件编码都是UTF-8。

            3.1.2 如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?

                    会乱码。

                    文件编码和读取的编码必须一致才不会乱码。

       3.2 字符输入转换流

            3.2.1 如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?

                    会乱码。

            3.2.2 如何解决呢?

                    使用字符输入转换流

                    可以提取文件(GBK)的原始字节流,原始字节不会存在问题。

                    然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了

            3.2.3 字符输入转换流InputStreamReader作用

                    可以解决字符流读取不同编码乱码的问题

                    public InputStreamReader(InputStream is,String charset):     可以指定编码把原始字节流转换成字符流,如此字符流中的字符不乱码。 

       3.3 字符输出转换流

            3.3.1 如果需要控制写出去的字符使用的编码,怎么办?

                    可以把字符以指定编码获取字节后再使用字节输出流写出去:

                             “我爱你中国”.getBytes(编码)

                    也可以使用字符输出转换流实现。

            3.3.2 字符输出转换流OutputStreamWriter的作用?

                    public OutputStreamWriter(OutputStream os,String charset)

                    可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码!

     4. 序列化对象

        4.1 对象序列化

            4.1.1 对象序列化的含义是什么?

                    把对象数据存入到文件中去。

            4.1.2 对象序列化用到了哪个流?

                    对象字节输出流ObjectOutputStram

                    public void writeObject(Object obj)

            4.1.3 序列化对象的要求是怎么样的?

                    对象必须实现序列化接口

        4.2 对象反序列化

            4.2.1 对象反序列化的含义是什么?

                    把磁盘中的对象数据恢复到内存的Java对象中。

            4.2 2 对象反序列化用到了哪个流?

                    对象字节输入流ObjectInputStram

                    public Object readObject()

     5. 打印流

        5.1 PrintStream、PrintWriter

            5.1.1 打印流有几种?各有什么特点?

                    打印流一般是指:PrintStream,PrintWriter两个类。

                    打印功能2者是一样的使用方式

                    PrintStream继承自字节输出流OutputStream,支持写字节

                    PrintWrite继承自字符输出流Writer,支持写字符

            5.1.2 打印流的优势是什么?

                    两者在打印功能上都是使用方便,性能高效(核心优势)

        5.2 输出语句的重定向

            属于打印流的一种应用,可以把输出语句的打印位置改到文件。

            PrintStream ps = new PrintStream("文件地址")

            System.setOut(ps);

     6. 补充知识: Proparties

            6.1 Properties的作用

                    可以存储Properties属性集的键值对数据到属性文件中去:

                            void store​(Writer writer, String comments)

                    可以加载属性文件中的数据到Properties对象中来:

                            void load​(Reader reader)

     7. 补充知识: IO框架

            7.1 commons-io概述

                    commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率。

                    commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils

             7.2 FileUtils主要有如下方法

    方法名说明
    String readFileToString(File file, String encoding)读取文件中的数据, 返回字符串
    void copyFile(File srcFile, File destFile)复制文件。
    void copyDirectoryToDirectory(File srcDir, File destDir)复制文件夹。

  • 相关阅读:
    选择性集成 - MDEP (PPSN-22): Multi-objective Evolutionary Ensemble Pruning Guided by Margin Distribution
    【29】c++设计模式——>策略模式
    6款原型产品设计软件
    基于Java Web的随意购商城系统
    微信小程序——<image>图片组件图片显示闪烁
    【图像处理GIU】图像分割(Matlab代码实现)
    Java毕业设计 SSM SpringBoot 水果蔬菜商城
    Lambda 在集合中的应用
    关于iOS:如何使用SwiftUI调整图片大小?
    SpringCloud和Kubernetes的区别
  • 原文地址:https://blog.csdn.net/LKS_010620/article/details/126932220