zoukankan      html  css  js  c++  java
  • IO流之转换流

    转换流

    OutputStreamWriter类

    查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去

    public static void writeCN() throws Exception {
    		//创建与文件关联的字节输出流对象
    		FileOutputStream fos = new FileOutputStream("c:\cn8.txt");
    		//创建可以把字符转成字节的转换流对象,并指定编码
    		OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
    		//调用转换流,把文字写出去,其实是写到转换流的缓冲区中
    		osw.write("你好");//写入缓冲区。
    		osw.close();
    	}
    

    OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?

    其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

     InputStreamReader类

    查阅InputStreamReader的API介绍,InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

    public class InputStreamReaderDemo {
    	public static void main(String[] args) throws IOException {
    		//演示字节转字符流的转换流
    		readCN();
    	}
    	public static void readCN() throws IOException{
    		//创建读取文件的字节流对象
    		InputStream in = new FileInputStream("c:\cn8.txt");
    		//创建转换流对象 
    		//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
            InputStreamReader isr = new InputStreamReader(in,"utf-8");
    		//使用转换流去读字节流中的字节
    		int ch = 0;
    		while((ch = isr.read())!=-1){
    			System.out.println((char)ch);
    		}
    		//关闭流
    		isr.close();
    	}
    }
    

    注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

    转换流和子类区别

    发现有如下继承关系:

    OutputStreamWriter:

                      |--FileWriter:

    InputStreamReader:

    |--FileReader;

    父类和子类的功能有什么区别呢?

    OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

    FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。

    InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

    InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

    FileReader fr = new FileReader("a.txt");

    这三句代码的功能是一样的,其中第三句最为便捷。

    注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流什么时候用子类呢?

    条件:

    1、操作的是文件。2、使用默认编码

    总结:

    字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

    字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

      

      

  • 相关阅读:
    解决NopCommerce 在iis缓存目录Temporary ASP.NET Files下存在两个版本的dll问题(一)
    给select标签设置下拉框高度
    ASP.NET MVC里ModelState.IsValid总是true或者总是false
    ubuntu虚拟机安装Gitlab后出现“Whoops, GitLab is taking too much time to respond.”
    C# JavaScriptSerializer序列化时的时间处理
    强大的pdf文件操作小工具——PDFtk的小白用法
    MySQL--pt-osc工具学习
    如何正确地在Spring Data JPA和Jackson中用上Java 8的时间相关API(即JSR 310也即java.time包下的众神器)
    ExtJS 6.2.0 增加中文排序支持
    SpringBoot项目中SecureRandom导致的Controller访问非常慢的问题
  • 原文地址:https://www.cnblogs.com/lxx2014/p/9541148.html
Copyright © 2011-2022 走看看