IO的作用:
- 处理设备之间的数据传输
- Java对数据的操作是通过流的方式,用于操作流的对象在IO包中(Java.io.*)
- 流按照操作数据分为:字节流(二进制,处理图片等)、字符流(基于字节流,处理汉字)
(为了方便处理文本数据:类似于字母映射ASCII表,汉字和二进制也有映射表GB2312(含几千字)+汉字映射表扩容GBK(含2万多字)。国际标准化组织将各国文字统一编排形成:unicode码表(全用2字节16位表示),优化后成为:utf-8(unicode转换码表,一个字节够就用一个,两个才够用两个,否则三个…))
所以,同一个词汇(中文和日文完全一样的词汇)有可能同时在GBK和utf-8中,会冲突。写中文存入计算机时,查GBK码表,查其对应的二进制数据,如果到了别的机器上,若采用utf-8码表读取,则会乱码,为了解决这个问题,Java在流技术上,基于字节流产生了字符流,它可以在内部去融合编码表,用于指定你查哪个码表,处理文字更方便。——字符流对象中是码表。 - 流按照流向分为:输入流、输出流
IO流常用基类:
- 字节流的抽象基类:InputStream(数据读进来),OutputStream(数据写出去)
- 字符流的抽象基类:Reader,Writer
- 由以上四个基类派生出来的子类名称都是以其父类名作为子类名的后缀。
——如:InputStream的子类FilelnputStream,Reader的子类FileReader
IO体系
(1)字符流
特点:数据最常见体现形式是文件;
//在硬盘上,创建一个文件,并写入一些文字数据
//找到专门用于操作文件的Writer子类对象FileWriter,后缀名是父类名,前缀名是该流对象的功能
import java.io.*;
public class FileWriterDemo
{
//由于FileWriter定义的构造器抛出了异常,这里的方法也得抛出异常
public static void main(String[] args) throws IOException//下面的方法内部都涉及到了IO异常
{
//创建FileWriter对象,该对象一被初始化,就必须要明确被操作的文件
//而且该文件会被创建到指定的目录下
FileWriter fw = new FileWriter("demo.txt");//产生一个对象,同时在指定目录下新建该文件
//调用write方法将数据写到流中
fw.write("abcde");//写入字符串(看不到),实际上是写入到内存中,也是写到了流中,因为流在内存中
//法一:刷新流对象中缓冲中的数据,将数据刷到目的地中,才能看到
//fw.flush();
//法二:关闭流资源,但是关闭前会刷新一次内部缓冲中的数据,将数据刷到目的地
//和flush的区别:flush刷新后,流可以继续使用,close刷新后会将流关闭,后面不能继续写
fw.close();
}
}