您的位置:首页 > 其它

IO-转换流的概述

2016-06-23 21:34 302 查看
将读到的字节转到相应的字符

一个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()强转。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: