JAVAEE细细看 进阶 12 - IO、 字符流
IO、字符流
字符流 = 字节流 + 编码表
一. 字符串中的编码和解码
字符流天然有缓冲区
编码: 通过实例方法
-byte[] getBytes();
-byte[] getBytes(String charsetName) 以指定编码方案进行编码
解码: 通过构造器
String(byte[])
String(byte[] , charsetName) 以指定方案解码
String s = "zhongguo中国";
// 编码
byte[] by = s.getBytes("UTF-8");
// 解码
s = new String(by,"UTF-8");
System.out.println(s);
二. 字符集
ASCII字符集
美国信息交换标准代码
GBK
最常用的中文码表
Unicode字符集
为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码,标准万国码。它最多使用4个字节来表达字母,符号,或者文字。有3中方案,UTF-8、UTF-16和UTF32,最常用的是UTF-8
三. 字节流
**InputStreamReader:**是从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
**OutputStreamWriter:**是从字符流到字节流的桥梁
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
文字很隐晦,直接敲码
// 输出流
FileOutputStream fo = new FileOutputStream("myCharStream/fo.txt");
// 字符输出流
OutputStreamWriter writer = new OutputStreamWriter(fo);
writer.write("*");
writer.close();
// 输入流
InputStreamReader reader = new InputStreamReader(new FileInputStream("myCharStream/fo.txt"));
// 读
int len;
while ((len = reader.read()) != -1) {
System.out.print((char)len);
}
reader.close();
四. 字符流写数据的5种方式
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("myCharStream/fo.txt",true));
// 写入一个字符
writer.write(97);
writer.write("\r\n--------\r\n");
writer.flush(); // 立即刷新数据
// 写入一个字符数组
char[] chars = new char[]{'a','b','c','d','e','f'};
writer.write(chars);
writer.write("\r\n--------\r\n");
// 写入字符数组中的一部分
writer.write(chars,1,3);
writer.write("\r\n--------\r\n");
// 写入一个字符串
writer.write("这是一段字符串");
writer.write("\r\n--------\r\n");
// 写入字符串的一部分
writer.write("我是华夏人",2,3);
writer.close(); // 先刷新,再关闭
/*
结果:
a
--------
abcdef
--------
bcd
--------
这是一段字符串
--------
华夏人
*/
五. 字符流读数据的2种方式
回忆下,
字节流写数据:一次写一个字节的数据,或者一次写一个字节数组的数据
字节流读数据:一次写一个字符的数据,或者一次写一个字符数组的数据
字符流写数据,一个字符,字符数组,字符串等
字符流读数据,一个字符,一个字符数组
InputStreamReader reader = new InputStreamReader(new FileInputStream("myCharStream/fo.txt"));
/*//读
// 一次一个
int len;
while ((len = reader.read()) != -1) {
System.out.print((char)len);
}*/
// 一次读多个
char[] chars = new char[1024];
int length;
while ((length = reader.read(chars)) != -1) {
System.out.println(new String(chars,0,length));
}
reader.close();
案例 :读一个java文件,复制到另一个文件夹中
// 字符流 - 读
InputStreamReader reader = new InputStreamReader(new FileInputStream("/Users/thor/desktop/Date.java"));
// 字符流 - 写
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("/Users/thor/desktop/avi/Date.java"));
// 读、写
char[] chars = new char[1024];
int len;
while ((len = reader.read(chars)) != -1) {
writer.write(chars, 0, len);
}
// 关闭
reader.close();
writer.close();
六. FileWriter 和 FileReader
它们分别是OutputStreamWriter 和 InputStreamReader的子类,在不需要考虑编码的时候,使用它们
构造方法
-FileWriter(string fileName)
-FileWriter(string fileName, append)
-FileReader(string fileName)
例子:还是复制.java文件
// 不考虑转换编码 - 读
FileReader reader = new FileReader("/Users/thor/desktop/Date.java");
// 不考虑转换编码 - 写
FileWriter writer = new FileWriter("/Users/thor/desktop/avi/Date.java",true);
// 复制
char[] chars = new char[1024];
int len;
while ((len = reader.read(chars)) != -1) {
writer.write(chars, 0, len);
}
// 关闭
reader.close();
writer.close();
七. 字符缓存流
贴图
还是复制java文件那个案例
// buffer 读、写
BufferedReader reader = new BufferedReader(new FileReader("/Users/thor/desktop/Date.java"));
BufferedWriter writer = new BufferedWriter(new FileWriter("/Users/thor/desktop/avi/Date.java"));
// 读写
char[] chars = new char[1024];
int len;
while ((len = reader.read(chars)) != -1) {
writer.write(chars, 0, len);
}
// 关闭
reader.close();
writer.close();
八. 字符缓冲流的特有功能
BufferedWriter:
- newLine(); 写一行行分隔符,是什么字符由系统决定
BufferedReader: - String readLine(); 读一行文字,但是不包含这一行的终止符号,已到结尾,则为null
有什么用呢? 它可以一次读一个字符串的数据
// 字符缓冲流 - 读、写
BufferedReader reader = new BufferedReader(new FileReader("/Users/thor/desktop/Date.java"));
BufferedWriter writer = new BufferedWriter(new FileWriter("/Users/thor/desktop/avi/Date.java"));
// 读写 一次一行
String string;
while ((string = reader.readLine()) != null) { // 一次读一行
writer.write(string);
writer.newLine(); // 因为readLine中不包含换行,所以这里换了行
}
// 关闭
reader.close();
writer.close();
下一篇: java properties操作