inputstreamreader是什么流_Java基础知识概述

inputstreamreader是什么流_Java基础知识概述一、InputStreamReader类  API文档说明:InputStreamReader类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。为了实现字节到字符的有效转换…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、InputStreamReader类

    API文档说明:InputStreamReader类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。 为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率,请考虑在BufferedReader中包装InputStreamReader

   其继承Reader类

public class InputStreamReader extends Reader {}

1)字节流到字符流的桥梁怎么理解?

    1、计算机存储的单位是字节,如尽管txt文本中有中文汉字这样的字符,但是对计算机而言,其是字节形式存在的

    2、字节流读取是单字节读取,但是不同字符集解码成字符需要不通过个数,因此字节流读取会报错

   3、 那么就需要一个流把字节流读取的字节进行缓冲而后在通过字符集解码成字符返回,因而形式上看是字符流

    4、InputStreamReader流就是起这个作用,实现从字节流到字符流的转换

2)使用指定的字符集读取字节并将它们解码为字符怎么理解?

      字节本质是8个二进制位,且不同的字符集对同一字节解码后的字符结果是不同的,因此在读取字符时务必要指定合适的字符集,否则读取的内容会产生乱码

3)它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集怎么理解?

      意味着InputStreamReader类有多个方法或者多个构造方法来设置字符集

4)每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节怎么理解?

      read()方法会尝试尽量冲底层字节流中读取2个字符到字符缓冲区中,注意这里是尽量,若遇到文件最后字符,则就只能读取到1个字符,因此每次read()方法读取的字节数是不定的

5)为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节,考虑在BufferedReader中包装InputStreamReader

     该话暂未理解,需要了解BufferedReader类后对比读取效率才可得出答案

 

二、InputStreamReader构造方法

1)使用默认的字符集构造InputStreamReader流:本质是初始化其实例域的一个变量,并未看到任何关于字符集的设置

 public InputStreamReader(InputStream in) {
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
        } catch (UnsupportedEncodingException e) {
           
            throw new Error(e);
        }
    }

2)使用指定的字符集名称构造InputStreamReader流:本质是初始化其实例域的一个变量,可以发现字符集是初始化方法的第三个参数

 public InputStreamReader(InputStream in, String charsetName)
        throws UnsupportedEncodingException
    {
        super(in);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
    }

3)sd变量:本质是StreamDecoder类的对象,InputStreamReader的构造方法就是在给此对象做初始化操作

private final StreamDecoder sd;

  三、InputStreamReaderAPI

 1、我们可以发现InputStreamReaderAPI类的所有API都是利用了sd变量的,因此可以看出InputStreamReader类的方法本质是调用StreamDecoder类方法

2、因此我们需要了解StreamDecoder类,以便了解到InputStreamReader类的方法是如何起实质性作用的


    /**
     * 获取设置的字符集
     */
    public String getEncoding() {
        return sd.getEncoding();
    }

    /**
     * 读取流并返回一个字符,遇到文件末尾返回-1
     */
    public int read() throws IOException {
        return sd.read();
    }

    /**
     * 读取字符到字符数组的部分中,遇到文件末尾返回-1
     */
    public int read(char cbuf[], int offset, int length) throws IOException {
        return sd.read(cbuf, offset, length);
    }

    /**
     * 检测流是否准备好呗读取
     */
    public boolean ready() throws IOException {
        return sd.ready();
    }

    /**
    * 关闭流并释放资源
    */
    public void close() throws IOException {
        sd.close();
    }

 

五、InputStreamReader类与FileReader类关系

      1、FileReader类仅仅是InputStreamReader的简单衍生并未扩展任何功能

      2、FileReader类读取数据实质是InputStreamReader类在读取,而InputStreamReader读取数据实际是StreamDecoder类读取

      3、因此在使用字符输入流的时候实际是StreamDecoder类在发挥作用

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189196.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java程序员必须知道的mysql优化的知识

    java程序员必须知道的mysql优化的知识

  • SpringBoot报错ERROR org.springframework.boot.SpringApplication – Application run failed[通俗易懂]

    SpringBoot报错ERROR org.springframework.boot.SpringApplication – Application run failed[通俗易懂]有时候启动springboot会成功,有时候会报下面的错误10:27:27.556[main]ERRORorg.springframework.boot.SpringApplication-Applicationrunfailedorg.yaml.snakeyaml.error.YAMLException:java.nio.charset.MalformedInputException:Inputlength=1 atorg.yaml.snakeyaml.reader.Str

  • 【愚公系列】2022年03月 漏洞扫描与利用之AWVS「建议收藏」

    【愚公系列】2022年03月 漏洞扫描与利用之AWVS「建议收藏」实验步骤一首先需要添加一个扫描目标,先不进行登陆操作:设置爬虫扫描开始扫描得出网站目录如果需要账号密码则需要设置方式一:方式二:之后点击“save”,保存后就可以进行扫描备注:FullScan–使用FullScan来发起一个扫描的话,Acunetix会检查所有可能得安全漏洞。HighRishVulnerabilities–这个扫描选项将仅仅只会检查那些对web站点影响最大的缺陷漏洞。Cross-SiteScripting(XSS)–XXS漏洞扫描只会检测跨站

  • 关于STM32使用LAN8720A插拔网线重连「建议收藏」

    关于STM32使用LAN8720A插拔网线重连「建议收藏」关于STM32使用LAN8720A插拔网线重连其实在做这个功能的时候大家一定要心平气和,不要认为有多复杂,多看DATASHEET,当然后面会遇到一些问题,所以在踩过坑之后,过了差不多一年了,也算是回过头来做个记录吧。1.关于LAN8720的手册解读通过查阅lan8720的数据收册:标黄部分,在寄存器映射中第一个寄存器为基本状态寄存器,然后我们通过查阅这个寄存器发现,在该寄存器的bit2中说明了,当检测网线插入的时候该位为1,否则为0。知道这个那就好办了,我们可以根据这个状态位去判断网线的接入状

  • 守护线程详解_线程池任务队列

    守护线程详解_线程池任务队列packagecom.lastinglate.concurrency.chapter4;publicclassDaemonThread{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt=newThread(){@Overridepublicvoidrun(){t

  • 谷歌浏览器驱动器下载网址

    谷歌浏览器驱动器下载网址chrome浏览器驱动下载地址:http://chromedriver.storage.proxy.ustclug.org/index.html

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号