Java基础-InputStreamReader和OutputSreamWriter

InputStreamReader

InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。一次只读一个字符。

构造函数

  • InputStreamReader(InputStream in)
    创建一个inputstreamreader使用默认字符集。
  • InputStreamReader(InputStream in, Charset cs)
    创建一个inputstreamreader使用给定的字符集。
  • InputStreamReader(InputStream in, CharsetDecoder dec)
    创建一个inputstreamreader使用给定的字符集解码。
  • InputStreamReader(InputStream in, String charsetName)
    创建一个inputstreamreader使用指定的字符集。

常用方法

  • void close() // 关闭该流并释放与之关联的所有资源。
  • String getEncoding() //返回此流使用的字符编码的名称。
  • int read() //读取单个字符。
  • int read(char[] cbuf, int offset, int length) //将字符读入数组中的某一部分。

OutputStreamWriter

OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。每次调用 write()方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。一次只写一个字符。

构造函数

  • OutputStreamWriter(OutputStream out) //创建使用默认字符编码的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, String charsetName) //创建使用指定字符集的 OutputStreamWriter。
  • OutputStreamWriter(OutputStream out, Charset cs) //创建使用给定字符集的 OutputStreamWriter。
  • OutputStreamWriter(OutputStream out, CharsetEncoder enc) //创建使用给定字符集编码器的OutputStreamWriter。

常用方法

  • void flush()
    刷新流。
  • String getEncoding()
    返回此流使用的字符编码的名称。
  • void write​(char[] cbuf, int off, int len)
    写一个字符数组的一部分。
  • void write​(int c)
    写一个字符。
  • void write​(String str, int off, int len)
    写一个字符串的一部分。

代码实战

 public static void ReaderWriterDemoPractice()throws IOException{
   //     复制StringCharsetNameQuestion.java文件
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java"),"UTF-8");
       OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestionCopy.txt"),inputStreamReader.getEncoding());
       char[] chars = new char[1024] ;
       int length = 0 ;
       while((length = inputStreamReader.read(chars)) != -1){
           outputStreamWriter.write(chars,0,length);
       }
       outputStreamWriter.close();
       inputStreamReader.close();
   }

特别注意:编码以及解码问题

延伸

public static void FileReaderWriterTest()throws IOException{
       FileReader fileReader = new FileReader(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java");
       FileWriter fileWriter = new FileWriter(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestionCopy2.txt");

       int length ;
       char[] chars = new char[1024];
       while ((length = fileReader.read(chars))!=-1){
           fileWriter.write(chars,0,length);
       }
       fileWriter.close();
       fileReader.close();
   }
  public static void BufferReaderWriter()throws IOException{
       //BufferedReader bufferedReader = new BufferedReader(new FileReader(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java")) ;
       // 最好将new InputstreamReader(new FileInputStream())的方式方式,因为这样设定编码方式
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestion.java"))) ;
       BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(".\\src\\ReaderWriterDemo\\StringCharsetNameQuestionCopy3.txt"));
    //   一次读取一个字符数据
       char[] chars = new char[1024];
       int length = 0 ;
       while((length = bufferedReader.read(chars))!=-1){
           bufferedWriter.write(chars,0,length);
       }
       bufferedWriter.close();
       bufferedReader.close();

    }
}

** 注意**整体方法都差不多,参照JDK1.8 API查询一下即可,具体的底层逻辑需要去查看源码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值