Chap10:IO流---字节流和字符流的区别(初学者可能有时候会分不清!不过很正常,这篇文章但愿客运帮到各位!)

1、流的概念
  • 1.一、程序中全部的数据都是以流的方式进行传输或保存的
  • 1.2、程序须要取数据的时候要使用输入流读取数据,而当程序须要将一些数据保存()到磁盘的时候,就要使用输出流完成。
  • 1.3切记:程序是内,文件...是外

2、流的超类
  • 2.1、字节流的超类:InputStream、OutputStreamios

    • 做用:处理字节、二进制对象。(其实可用于任何类型的对象,但它不能直接处理Unicode字符)
    • 操做对象:字节流处理单元为1个字节,操做字节和字节数组
  • 2.二、字符流的超类: Reader、Writer数组

    • 做用: 直接处理字符、字符串。
    • 操做对象:处理的单元为2个字节的Unicode字符
    • 拓展:字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的
  • 2.三、用途推荐函数

    • 音频文件、图片、歌曲,就用字节流好点
    • 关系到中文(文本)的,用字符流好点
  • 2.四、前言:其实前言放在这里,笔者认为是不合适的,以前的铺垫只是方便读者快读进入状态学习

    • 字节流和字符流的关系:
    • 字节流不足:实际开发中不少的数据是文本,字节流提供了处理任何类型的IO操做的功能,但它不能直接处理Unicode字符,因而提出了字符流的概念。
    • 字符流的诞生:字符流按虚拟机的encode处理,也就是经过InputStreamReader,OutputStreamWriter进行字符集的转化优化

      • 转化(注:初学者能够不看该转化知识,若是想了解原理,该段是有帮助的):编码

        • InputStreamReader:用于将一个字节流中的字节解码成字符,其构造函数
          InputStreamReader isr = new InputStreamReader(InputStream in)的参数是一个InputStream对象,用 对象.read(char[] data),的方式获取内容
        • OutputStreamWriter:用于将写入的字符编码成字节后写入一个字节流,其构造函数
          OutputStreamWriter osw = new OutputStreamWriter(OutputStream out)是一个OutputStream对象,一般用对象.write(String str)的方式写到 对象绑定的输出流上。
        • 两者都是处理流(包装流、非结点流)---不可直接操做数据!。由上可知两者底层分别是经过byte[]和String来关联它们对应的流对象!
3、字节流与字符流的区别
  • 3.一、操做文件时的区别:code

    • 字节流:在操做时不会用到缓冲区(内存),是直接对文件自己进行操做的
    • 字符流:在操做时则使用了缓冲区,经过缓冲区再操做文件。
  • 3.二、存在形式区别:视频

    • 在硬盘上的全部文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会造成
4、分析与优化
  • 分析:对象

    • 对于3.1中的第一点:若是一个程序频繁对一个资源进行IO操做,效率会很是低
  • 优化图片

    • 此时,经过缓冲区,先把须要操做的数据暂时放入内存中,之后直接从内存中读取数据,则能够避免屡次的IO操做,提升效率。下面是部分代码:
/*(1)对于视频、图片等文件的加缓冲优化*/
byte[] fileToByteArray (String filePath){
    File des = new File(filePath);
    FileInputStream fis = new FileInputStream(des);
    ByteArrayOutputStream bios = new ByteArrayOutputStream();
    
    byte[] datas = new byte[1024];     //缓冲容器:提升效率`
    int len = -1;
    while ((len = fis.read(datas)) != -1){
        bios.write(datas, 0, len); 
       //把字节数组datas的内容 写入到 字节数组输出流 中--分段写入
    }
    bios.flush();  //强制将缓冲区中的数据写入输出流,并清空缓冲区
    return bios.toByteArray();  
}
/*(2)对于纯文本文件的加缓冲优化:*/
   //BufferedReader,内部其实维护一个缓冲字符数组
    String tempStr = "";
    try (FileReader fr = new FileReader("a.txt");
         FileWriter fw = new FileWriter("b.txt");
         BufferedWriter bw = new BufferedWriter(fw);
         BufferedReader br = new BufferedReader(fr)){   //包装:

         while ((tempStr = br.readLine()) != null){
            //将读取的"一行"字符串写入文件中
            bw.write(tempStr);
            //写入下一行的时候,先换行
            bw.newLine();
        }
    }
    catch (IOException e){
        e.printStackTrace();
    }
附:笔者并无把规范的代码展现出来,只是把与本文相关的核心代码展现给了你们你们有兴趣能够自行补充。内容其实很少,加多几个try,catch语句便可! 喜欢做者的文章但愿能够被您采纳,咱们一块儿学习,共同进步!
相关文章
相关标签/搜索