java InputStreamReader_InputStream

java InputStreamReader_InputStream简介OutputStreamWriter和InputStreamReader是字节流和字符流转化之间桥梁,OutputStreamWriter继承自Writer接口,而InputStreamReader继承自接口Reader.需要了解的一点是字符流的写入和读取的方式.字符输出流:将字符通过指定编码方式转化成字节数据,然后存储到文件中. 字符输入流:读取文件的字节数据通过相同的编码方式转化…

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

Jetbrains全系列IDE稳定放心使用

简介

OutputStreamWriter和InputStreamReader是字节流和字符流转化之间桥梁,OutputStreamWriter继承自Writer接口,而InputStreamReader继承自接口Reader.需要了解的一点是字符流的写入和读取的方式.

  • 字符输出流:将字符通过指定编码方式转化成字节数据,然后存储到文件中.
  • 字符输入流:读取文件的字节数据通过相同的编码方式转化成字符.不同的编码方式会造成乱码.

1.InputStreamReader是字节流转化成字符流的桥梁.通过给定字符编码方式或者传入指定编码方式,平台默认编码方式等将字节转化成字符读取到流中.子类有FileReader.

2.OutputStreamWriter是字符流转化成字节流的桥梁,通过给定字符编码方式或者传入指定编码方式,平台默认编码方式等将字符转化成字节写到流中.子类有FileWriter.

OutputStreamWriter介绍

1.构造方法.

public OutputStreamWriter(OutputStream out, String charsetName){}
public OutputStreamWriter(OutputStream out) {}
public OutputStreamWriter(OutputStream out, Charset cs) {}
public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {}

四个有参构造方法,区别是编码传入方式.分别是:

  • 创建一个指定了底层字节输出流和”指定”字符编码名称charsetName的OutputStreamWriter流.
  • 创建一个指定了底层字节输出流和默认字符编码方式的OutputStreamWriter流.
  • 创建一个指定底层字节输出流和”给定”字符编码方式cs的OutputStreamWriter流.
  • 创建一个 指定底层字节输出流和”给定”字符编码器enc的OutputStreamWriter流.

2.内部变量

private final StreamEncoder se;
  • 负责字符编码的类StreamEncoder.

3.内部方法

public String getEncoding() 
public void write(int c){}
public void write(char cbuf[], int off, int len){}
public void write(String str, int off, int len){}
public void flush() {}
public void close() {}
  • getEncoding()—-获取字符编码方式.
  • write(int c)—将单个字符写到流中.
  • write(char cbuf[],int off,int len)–将字符数组cbuf中,off位置开始,len个字符写到流中.
  • write(String str,int off,int len)—将字符串str中,off位置开始,len个字符写到流中.
  • flush()—刷新流.
  • close()—关闭流,释放相关资源.

InputStreamReader介绍

1.构造方法.

public InputStreamReader(InputStream in) {}
public InputStreamReader(InputStream in, String charsetName){}
public InputStreamReader(InputStream in, Charset cs) {}
public InputStreamReader(InputStream in, CharsetDecoder dec) {}

与OutputStreamWriter流相对应的四种有参构造方法,根据对应的字符编码方式将数据解码读取.

  • 创建一个指定了底层字节输出流和默认字符编码方式的InputStreamReader流.
  • 创建一个指定了底层字节输出流和”指定”字符编码名称charsetName的InputStreamReader流.
  • 创建一个指定底层字节输出流和”给定”字符编码方式cs的InputStreamReader流.
  • 创建一个 指定底层字节输出流和”给定”字符编码器dec的InputStreamReader流.

2.内部变量

private final StreamDecoder sd;
  • 负责字符解码的类StreamDecoder.

3.内部方法

public String getEncoding() {}
public int read(){}
public int read(char cbuf[], int offset, int length){}
public boolean ready(){}
public void close(){}
  • getEncoding()—获取字符编码方式
  • read()—从流中读取单个字符.
  • read(char cbuf[],int offset,int length)—将流中length个字符读取到字符数组cbuf中,cbuf中从offset位置开始
  • ready()—流是否准备读取,读取缓冲区不为空或者底层输入流中可读取数据时返回true.
  • close()—关闭流,释放相关资源.

案例

public class InputStreamDemo {
  public static void main(String[] args) throws IOException {
    String charsetName="UTF-8";
    testOutputStreamWriter(charsetName);
    testInputStreamReader(charsetName);
  }
  
  private static void testOutputStreamWriter(String charsetName) throws IOException {
    char[] cbuf = new char[] {'h','e','l','l','o','w','o','r','l','d'};
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\java.txt"),charsetName);
    osw.write("0123456789", 0, 8);
    osw.write(cbuf, 1, 6);
    osw.write('h');
    osw.close();
  }
  
  private static void testInputStreamReader(String charsetName) throws IOException {
    InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\java.txt"),charsetName);
    int read = isr.read();
    System.out.println("单个字符--------"+(char)read);
    char[] cbuf = new char[1024];
    isr.read(cbuf, 0, 10);
    System.out.println(new String(cbuf));
    String encoding = isr.getEncoding();
    System.out.println("解码方式--------"+encoding);
    isr.close();
  }
}

运行结果:

单个字符——–0
1234567ell
解码方式——–UTF8

源码分析

1.InputStreamWriter源码分析

public class OutputStreamWriter extends Writer {
    //负责编码的类StreamEncoder
    private final StreamEncoder se;

    //创建一个指定字节输出流和"指定"的字符编码名称的OutputStreamWriter流.
    public OutputStreamWriter(OutputStream out, String charsetName)
        throws UnsupportedEncodingException
    {
        super(out);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
    }

    //创建一个指定字节输出流和默认编码方式的OutputStreamWriter流.
    public OutputStreamWriter(OutputStream out) {
        super(out);
        try {
            se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
        } catch (UnsupportedEncodingException e) {
            throw new Error(e);
        }
    }

    //创建一个指定字节输出流和"给定"字符编码方式的OutputStreamWriter流.
    public OutputStreamWriter(OutputStream out, Charset cs) {
        super(out);
        if (cs == null)
            throw new NullPointerException("charset");
        se = StreamEncoder.forOutputStreamWriter(out, this, cs);
    }


    //创建一个指定字节输出流和"给定"编码器的OutputStreamWriter流.
    public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
        super(out);
        if (enc == null)
            throw new NullPointerException("charset encoder");
        se = StreamEncoder.forOutputStreamWriter(out, this, enc);
    }

    //获取编码方式.
    public String getEncoding() {
        return se.getEncoding();
    }

    //刷新输出缓冲数据到底层字节流中
    void flushBuffer() throws IOException {
        se.flushBuffer();
    }

    //将单个字符写到流中
    public void write(int c) throws IOException {
        se.write(c);
    }

    //将字符数组cbuf中,off位置开始,len个字符写到流中
    public void write(char cbuf[], int off, int len) throws IOException {
        se.write(cbuf, off, len);
    }

    //将字符串中off位置开始,len个字符写到流中
    public void write(String str, int off, int len) throws IOException {
        se.write(str, off, len);
    }

    //刷新流
    public void flush() throws IOException {
        se.flush();
    }
    
    //关闭流,释放相关资源
    public void close() throws IOException {
        se.close();
    }
}

2.InputStreamReader源码分析

public class InputStreamReader extends Reader {
    //负责解码的类StreamDecoder
    private final StreamDecoder sd;

    //创建一个指定了底层字节输入流和默认字符编码方式的InputStreamReader流
    public InputStreamReader(InputStream in) {
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
        } catch (UnsupportedEncodingException e) {
            // The default encoding should always be available
            throw new Error(e);
        }
    }

    //创建一个指定了底层字节输入流和"指定"字符集编码方式的InputStreamReader流
    public InputStreamReader(InputStream in, String charsetName)
        throws UnsupportedEncodingException
    {
        super(in);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
    }

    //创建一个指定了底层 字节输入流和"给定"字符编码方式的InputStreamReader流.
    public InputStreamReader(InputStream in, Charset cs) {
        super(in);
        if (cs == null)
            throw new NullPointerException("charset");
        sd = StreamDecoder.forInputStreamReader(in, this, cs);
    }

    //创建一个指定了底层字节输入流和"给定"字符集编码器的InputStreamReader流.
    public InputStreamReader(InputStream in, CharsetDecoder dec) {
        super(in);
        if (dec == null)
            throw new NullPointerException("charset decoder");
        sd = StreamDecoder.forInputStreamReader(in, this, dec);
    }

    //获取流使用的字符编码方式
    public String getEncoding() {
        return sd.getEncoding();
    }

    //从流中读取单个字符
    public int read() throws IOException {
        return sd.read();
    }

    //从InputStreamReader流中读取字符数据到字数数组cbuf中,cbuf中位置从offset开始,长度为length个字符
    public int read(char cbuf[], int offset, int length) throws IOException {
        return sd.read(cbuf, offset, length);
    }

    //流是否准备读取,读取缓冲区不为空或者底层输入流中可读取数据时返回true.
    public boolean ready() throws IOException {
        return sd.ready();
    }

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

总结

InputStreamReader流和OutputStreamWriter流作为字节和字符转换的桥梁,需要知道字符是以指定的编码方式存储到文件中,同理读取文件的时候,通过相同的编码方式进行解码成字符,读取到内存或者程序中.其中”指定的编码方式”在创建流的时候需要指定,否则是默认的编码方式(GBK).

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189439.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月13日 下午5:58
下一篇 2026年4月13日 下午6:04


相关推荐

  • S3C2440移植uboot之支持NAND启动

    S3C2440移植uboot之支持NAND启动上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动。

    2022年6月13日
    40
  • ArcGIS二次开发基础教程(03):保存文档和导出地图

    ArcGIS二次开发基础教程(03):保存文档和导出地图ArcGIS二次开发基础教程(03):保存文档和导出地图保存文档保存://这里的path为全局变量在打开文件获添加数据时赋值原路径//判断打开文件是否为mxd文件是则保存不是则另存为if(System.IO.File.Exists(path.Remove(path.IndexOf(‘.’))+”.mxd”)){//对于已打开的mxd文档保存在原路径//…

    2022年7月23日
    23
  • CAN总线传输协议[通俗易懂]

    CAN总线传输协议[通俗易懂]一、控制器局域网总线(CAN,ControllerAreaNetwork)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线、同轴电缆或光纤来传输信号,因其高性能、高可靠性和高实时性等特点,已经成为了世界上应用最广泛的现场总线之一。公元1991年,CAN总线技术规范(CANVersion2.0)制定并发布,该技术规范共包括A和B两部分,称为CAN2.0A和CAN2.0B。其中CAN2.0…

    2022年6月28日
    39
  • 用 OpenClaw AI Agent,他5天赚了$700 MRR(完整复盘)

    用 OpenClaw AI Agent,他5天赚了$700 MRR(完整复盘)

    2026年3月15日
    2
  • 全方位剖析QT 面试题 胡峰原创

    全方位剖析QT 面试题 胡峰原创自己毕业后参加过很多面试,当然有以应聘者的身份参加的也有以面试官的身份参加的,下面我想总结下一些面试官出题的方向和回答的技巧,下面截取我对一个应届毕业生的面试过程作为讲解,希望能对再今后的面试任职时有所帮助。姓名AAA性别男民族汉族籍贯河北省AA出生日期AAA婚姻状况否学历学士政治面貌AA专业计算机科学与技术健康情况健康毕业院校AAA邮编A联系电话AAA邮箱AA个人技能我学习了嵌入式方向所涉及的51单片机、操作系统、ARM、Qt等,期间做过许多小实验,单片机最经典的

    2022年6月25日
    116
  • 掌握如何使用Rose绘制活动图的方法[通俗易懂]

    掌握如何使用Rose绘制活动图的方法[通俗易懂]一、实验目的(1)熟悉活动图的基本功能和使用方法。(2)掌握如何使用Rose绘制活动图的方法。二、实验要求(1)4学时;(2)每组1人;(3)设计性实验;三、实验主要设备台式或笔记本电脑四、实验内容1.案例:借鉴我校图书管理系统,根据图书信息入库、借阅、归还、检索等活动流程,分析相关活动需求和活动到活动变化,使用rationalrose绘制图书管理系统…

    2022年5月7日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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