Java基础之——IO流(字符流、转换流、缓冲流)
字符流原理
Reader是所有字符输入流的父类,而Writer是所有字符输出流的父类,字符流是以字符(char)为单位读写数据的,一次处理一个unicode,字符流都是高级流,其底层都是依靠字节流读写数据。
Reader的常用方法
writer的常用方法
转换流
字符编码
计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。
字符编码(character Encoding):就是一套自然语言的字符与二进制数之间的对应规则。
ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx
iso-8859-1:一个字节表示一个字符:所有的8位都表示数据,xxxx xxxx 全部
用来表示字符数据
GB2312: 简体中文码表。包含6000-7000中文和符号。用两个字节表示。
两个字节第一个字节是负数,第二个字节可能是正数。
GBK: 目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中
的一部分文字,第一个字节开头是1,第二字节开头是0。
UTF-8: 基于unicode,一个字节就可以存储数据,不要用两个字节存储,
而且这个码表更加的标准化,在每一个字节头加入了编码信息
文字—>(数字) :编码: 就是把能看懂内容,转换成看不懂的内容。
例如:A ——> 65
(数字)—>文字 : 解码: 就是把看不懂的内容,转换成看懂的内容。
例如:65 ——> A
inputStreamReader
inputStreamReader是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
InputStreamReader的构造方法
InputStreamReader(“java.txt”,“GBK”)
创建使用指定字符集的 InputStreamReader
InputStreamReader(“java.txt”)
创建一个使用默认字符集的 InputStreamReader
OutputStreamReader
OutputStreamReader是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集讲字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
OutputStreamReader的构造方法
OutputStreamWriter(“java.txt”,“GBK”)
创建使用指定字符集的 OutputStreamWriter。
OutputStreamWriter(“java.txt”)
创建使用默认字符编码的 OutputStreamWriter。
总结:
字节—>字符 : 看不懂的—>看的懂的。 需要读。输入流。 InputStreamReader
字符—>字节 : 看的懂的—>看不懂的。 需要写。输出流。 OutputStreamWriter
缓冲流
flush()和close()的区别?
flush():将缓冲区内的数据刷新到目的地中,刷新后,流还可以继续使用。
close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
缓冲流基本工作原理:
在向硬件装备做写出操作时,增大写出次数无疑也会降低写出效率,为此可以使用缓冲 流来一次性的批量写出若干数据 每当我们想该流写数据或读取数据时,都会将数据存入缓冲区,当缓冲区已满时,缓冲流 将数据一次性全部写出
BufferedOutputStream
将缓冲区的内容强制写出
public static void writeCN() throws Exception { //创建与文件关联的字节输出流对象 FileOutputStream fos = new FileOutputStream("d:\\file.txt"); //创建可以把字符转成字节的转换流对象,并指定编码 OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); //调用转换流,把文字写出去,其实是写到转换流的缓冲区中 bos.write('a');//并没有向磁盘写出,而是写到BOS缓冲区 bos.flush();//强制写出 bos.close();//实际上,close方法在执行前执行flush }
BufferedInputStream
public class InputStreamReaderDemo { public static void main(String[] args) throws IOException { //演示字节转字符流的转换流 readCN(); } public static void readCN() throws IOException{ //创建读取文件的字节流对象 InputStream in = new FileInputStream("d:\\file.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(); } }
注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象.
- JAVA基础再回首(二十二)——转换流概述及用法、简化写法FileWriter和 FileReader、字符缓冲流及特殊用法、字节流字符流复制文件方法总结
- java基础--IO流之字节、字符和转换流
- java基础--IO流之字节、字符和转换流
- 黑马程序员——Java基础---IO流(字符流、字节流、转换流、流操作规律)
- 黑马程序员——JAVA基础------IO流(四)----字节字符转换流和缓冲流
- Java基础-IO流-转换流(字符流)
- Java基础之IO流,按字符数组读取文件(二)
- IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)
- Java基础知识强化之IO流笔记39:字符流缓冲流之复制文本文件案例01
- Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
- 黑马程序员_Java基础_IO流_字符流,带缓冲区的字符流,文本文件读写
- 黑马程序员java 基础之io流中的字符流
- java基础 字符缓冲流[BufferedReader 和 BufferedWriter]
- JAVA基础复习二十一-IO流-字符流
- java基础学习IO流之缓冲流 十一 -5
- java基础11(IO流)-字符流
- Java基础知识强化之IO流笔记34:OutputStreamWriter(Writer字符流的子类)5种write数据方式
- java基础45 IO流技术(输入字符流/缓冲输入字符流)