IO-转换流的概述

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO-转换流的概述相关的知识,希望对你有一定的参考价值。


将读到的字节转到相应的字符

     

    一个16进制位 代表的是42进制位216进制的数就是一个字节

     1个字节82进制位

     1个字节216进制    16进制=42进制

    Int 类型的数字是4个字节

     

    utf-8,会在每个字节上标识,对几个字节标识一下

    utf-8,对文字的存储进行了空间优化

     

    utf-8,解析中问,一个中文是3个字节

 

 

转换流

InputStreamReader,  OutputStreamWriter

    转换流的由来

        字符流与字节流之间的桥梁

        方便了字符流与字节流之间的操作

    转换流的应用

        字节流中的数据都是字符时,转成字符流操作更高效。

    例程:标准输入输出。

 

 

java.io

OutputStreamWriter

    public class OutputStream Writer extends Writer   

    OutputStreamWriter 字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 

    每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

    为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

 Writer out  = new BufferedWriter(new OutputStreamWriter(System.out));

 

 

java.io

InputStreamReader

    public class InputStreamReader extends Reader

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

    每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 

    为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

 

 BufferedReader in  = new BufferedReader(new InputStreamReader(System.in));


IO-转换流-字符向字节的桥梁-OutputStreamWriter

package day20.io.p3.transstream;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
 
public class TransStream_WriterDemo {
 
    public static void main(String[] args) throws IOException {
        /*
         * 演示转换流
         */
        writeFile();
    }
    
    /*
     * 第一个,先将已有的中文字符串,按照编码存储到硬盘上。
     */
     
    public static void writeFile() throws IOException {
        //使用默认编码表
        //FileWriter fw = new FileWriter("temp\\default.txt");
        //fw.write("你好");
        //fw.close();
        //使用转换流,通过默认码表,转换流OutputStreamWriter是字符流,
        //OutputStreamWriter构造函数接收一个字节流对象参数,因为该类是字符流与字节流的转换的桥梁
        /*FileOutputStream fos = new FileOutputStream("temp\\trans_default.txt");
        OutputStreamWriter osw =
         new OutputStreamWriter(fos);
        osw.write("你好");
        osw.close();*/
        //使用指定编码表GBK。将字符转换成字节,转换流OutputStreamWriter是字符流,
         
        //FileOutputStream fos = new FileOutputStream("temp\\trans_GBK.txt");
        //OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
        //
        //osw.write("你好");
        //
        //osw.close();
        //转换流:字节流+编码表(可以指定)
        //   |---用于操作File的子类,FileWriter字节流+本地默认编码表,对默认编码的字符文件操作起来比父类更为便捷。
        FileOutputStream fos = new FileOutputStream("temp\\trans_UTF8.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
        osw.write("你好");
        osw.close();
    }
}

 

25-IO-转换流-字节向字符的桥梁-InputStreamReader

 

package day20.io.p3.transstream;
 
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class TransStream_ReaderDemo {
 
    public static void main(String[] args) throws IOException {
        /*
         * 演示转换符,字节-->字符
         */
            readfile();
     
    }
     
    public static void readfile() throws IOException {
        //1.读取已有的字符文件,为指定的编码
        FileReader fr = new FileReader("temp\\default.txt");
        //
        //char[] buf = new char[1024];
        //
        //int len = fr.read(buf);
        //String str = new String(buf,0,len);
        //System.out.println(str);
        //
        //int ch1 = fr.read();
        //System.out.println((char)ch1);
        //
        //int ch2 = fr.read();
        //System.out.println(ch2);
        //
        //int ch3 = fr.read();
        //System.out.println(ch3);
        //
        //
        //fr.close();
        //2.既然是存储到硬盘上的都是字节数据,干脆就使用字节流读不就好了
        //不行,因为读取到的都是字节数据,没有查表,无法获取对应的文字
        //所以应该将字节转成字符数据,使用转换流完成InputStreamReader.
        //FileInputStream fis = new FileInputStream("temp\\trans_default.txt");
        //InputStreamReader isr = new InputStreamReader(fis,"GBK");//使用的是默认字符集或者GBK的码表,
        //
        //int ch1 = isr.read();
        //System.out.println((char)ch1);
        //int ch2 = isr.read();
        //System.out.println((char)ch2);
        //int ch3 = isr.read();
        //System.out.println(ch3);
        //
        //
        //isr.close();
        FileInputStream fis = new FileInputStream("temp\\trans_UTF8.txt");
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
        char[] buf = new char[1024];
        int len=0;
        while((len = isr.read(buf))!=-1){
        String str = new String(buf,0,len);
        System.out.println(str);
        }
        isr.close();
        //FileInputStream fis = new FileInputStream("temp\\default.txt");
        //
        //int ch = fis.read();
        //
        //System.out.println(ch);
        //fis.close();
        ////
    }

}

 

IO-小细节

 

    有字符流对图片进行复制

    字符流读取图片的字节查了编码表之后,

    图片的字节A在编码表里找不到相应的字符,

    编码表就要找个未知字符来对应字节A

    编码改变,到目的地之后,和原来的字节肯定不一样了

      

一个字节=82进制,一个整数322进制。int提升字节

    write();4个字节数强制转换位1个字节。将高位删除,write()强转。


以上是关于IO-转换流的概述的主要内容,如果未能解决你的问题,请参考以下文章

java IO流 转换流的使用 以及编码集

Arduino 如何将读到的数据前面加一个字母通过串口发送出去

java中字节流与字符流的区别

Java IO流--转换流的使用

IO流 写入转换流(写入和读取转换流的区别,考虑方向)

I/O流