IO-转换流的概述
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO-转换流的概述相关的知识,希望对你有一定的参考价值。
将读到的字节转到相应的字符
一个16进制位 代表的是4个2进制位,2个16进制的数就是一个字节
1个字节8个2进制位
1个字节2个16进制 16进制=4个2进制
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,
编码改变,到目的地之后,和原来的字节肯定不一样了
一个字节=8位2进制,一个整数32位2进制。int提升字节
write();将4个字节数强制转换位1个字节。将高位删除,write()强转。
以上是关于IO-转换流的概述的主要内容,如果未能解决你的问题,请参考以下文章