_____IO(Input Output)流_____
概述
IO流就是用来处理设备之间的数据传输的,而Java对数据的的操作时通过流的方式,其操作流的类都在IO包中。
流分类
按照操作的数据分为:字节流和字符流按流向分为:输入流,输出流
IO流常用基类
字节流的抽象基类:InputStream,OutputStream字符流的抽象基类:Reader,Writer
在说IO流之前,我们先要理解几个概念:
字节:一字节(byte)等于8位二进制码,在计算机中存储的信息都是以二进制形式表示的
字符:为了方便人机交互,将人类语言和计算机二进制语言之间建立一个映射表(编码表),通过不同的二进制码来表示不同的文字,所看到的人类语言字体就是字符,一个字符因为编码的不同会占用不同的字节数
编码表:人类文字在计算机中的存储映射,编码表按照时间顺序常见的有ASCII,GB2312中文对应表,扩容中文码表GBK,扩充中文码表GB18030(区分中文编码的方法是高字节的最高位不为0,从ASCII到GB18030是向下兼容的);为了整合世界文字编码,出现了unicode字符编码标准,而UTF-8编码表就是其实现方式之一
乱码:
0000 0000计算机中八位为1字节,ASCII编码表中用0100 0001来代表文字"A"。同一个文字在不同的编码表中映射可能不一致,比如在GBK编码表中文字“黑”的编码为BADA,在UTF-8中“黑”为E9BB91,当我们以GBK形式将黑(BADA)存入计算机文本文件,在读取文本文件的时候对照UTF-8编码表翻译,那么取出来的将不是文字“黑”,而是其他文字或者查询不到任何文字,这就是乱码。
字符流
概述:
对于数据而言,文本居多,所以Java单独建立了字符流来处理文本数据
文本文件流:FileWriter和FileReader
概述:
这是字符流抽象基类的两个实现子类,主要是对文本文件进行IO操作。
FileWriter写出文件实例:
FileWriter fw = null;
try {
//只能创建文件,不能创建路径,路径必须为已有路径
fw = new FileWriter("D:/demo.txt");
fw.write("黑马");
//此类具有缓存机制,写入的数据暂时保存在流中,需要刷新才能写入到文本文件中
//close()关闭流时会自动执行一次刷新操作,所以此处可以省略
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
FileReader读入文件实例:
FileReader fr = null;
try {
fr = new FileReader("D:/demo.txt");
char[] cbuf = new char[1];// 读取到数据在非UTF-8编码下为2KB大小,char为2字节16位;UTF-8编码下为3KB大小
int len = -1;
while ((len = fr.read(cbuf)) != -1) {
System.out.println(len + ":" + new String(cbuf, 0, len));
System.out.println(Integer.toHexString(cbuf[0]));
/*
* Windows系统创建的UTF-8文本文件通常会在文本的开头放置一个标识字节序的编码;
* 所以自己通过windows系统创建的文本可能出现读取出来的第一位长度为1,内容为空,存储的是字节序
* 字节序分为如下两类:
* FFFE:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端;
* FEFF:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端;
* 比如 int a = 0x05060708:
* 在BIG-ENDIAN的情况下存放为: 字节号 0 1 2 3 数据 05 06 07 08
* 在LITTLE-ENDIAN的情况下存放为: 字节号 0 1 2 3 数据 08 07 06 05
*/
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
FileReader与FileWriter结合使用:
//读取文本文件并且写入另一个文本文件
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("D:/demo.txt");
fw = new FileWriter("D:/demo2.txt&#