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

     1个字节82进制位  1111 0000

     1个字节216进制    af    

    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()强转。