黑马程序员技术交流社区

标题: 缓冲流,转换流 [打印本页]

作者: 初入江湖的小飞    时间: 2018-8-7 10:32
标题: 缓冲流,转换流
缓冲流,转换流

缓冲流



字节缓冲流

|_ BufferedInputStream # 缓冲字节输入流

|_ BufferedOutputStream # 缓冲字节输出流


java.io.BufferedOutputStream类: 缓冲字节输出流
// 构造方法
BufferedOutputStream(OutputStream out): 使用基本流创建一个缓冲字节输出流
BufferedOutputStream(OutputStream out, int size): 使用基本流创建一个缓冲字节输出流, 设置缓冲区大小
BufferedOutputStream使用步骤:
1.创建FileOutputStream对象, 构造方法中绑定要输出的目的地
2.创建BufferedOutputStream对象, 构造方法中传递FileOutputStream对象, 提高FileOutputStream效率
3.使用BufferedOutputStream对象中的方法 write(), 把数据写入到内部缓冲区中
4.使用BufferedOutputStream对象中的方法 flush(), 把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先调用flush方法刷新数据, 第4步可以省略)

java.io.BufferedInputStream类: 缓冲字节输入流
// 构造方法
BufferedInputStream(InputStream in): 使用基本流创建一个缓冲字节输入流
BufferedInputStream(InputStream in, int size): 使用基本流创建一个缓冲字节输入流, 设置缓冲区大小
使用步骤:
1.创建FileInputStream对象, 构造方法中绑定要读取的数据源
2.创建BufferedInputStream对象, 构造方法中传递FileInputStream对象, 提高FileInputStream效率
3.使用BufferedInputStream对象中的方法 read(), 读取文件
4.释放资源 close()




[Java] 纯文本查看 复制代码
public class Test {
public static void main(String[] args) throws IOException {
// 创建缓冲字节输入流对象
BufferedInputStream bis = new BufferedInputStream(new
FileInputStream("day10\\testBufferedOutput1.txt"));
// 一次读一个字节数组
byte[] bytes = new byte[1024];
int len;
while ((len = bis.read(bytes)) != -1) {
// 打印字符串
System.out.println(new String(bytes, 0, len));
}
bis.close();
}
}



字符缓冲流
|_ BufferedReader # 缓冲字符输入流
|_ BufferedWriter # 缓冲字符输出流


java.io.BufferedWriter类:缓冲字符输出流
// 构造方法
BufferedWriter(Writer out): 使用基本流创建一个缓冲字符输出流
BufferedWriter(Writer out, int size): 使用基本流创建一个缓冲字符输出流, 设置缓冲区大小
// 特有方法
void newLine(): 写入一个换行符, 换行符自动根据当前系统确定

java.io.BufferedReader类: 缓冲字符输入流
// 构造方法
BufferedReader(Reader in): 使用基本流创建一个缓冲字符输入流
BufferedReader(Reader in, int size): 使用基本流创建一个缓冲字符输入流, 设置缓冲区大小
// 特有方法
String readLine(): 一次读一行字符串, "不包含换行符". 读到文件末尾返回null




[Java] 纯文本查看 复制代码
public class Test {
public static void main(String[] args) throws IOException {
// 创建缓冲字符输入流对象
BufferedReader br = new BufferedReader(new FileReader("day10\\in.txt"));
// 创建缓冲字符输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\out.txt"));
// 创建HashMap集合
HashMap<String, String> map = new HashMap<>();
// 读取文件
String line;
while ((line = br.readLine()) != null) {
// 将读取到的字符串按照.拆分
String[] split = line.split("\\.");
// 添加到集合中
map.put(split[0], split[1]);
}
// 遍历Map集合, 拼接好, 写出到新文件
for (String key : map.keySet()) {
String value = map.get(key);
// 拼接
String result = key + "." + value;
// 写出
bw.write(result);
bw.newLine();
}
// 释放资源
br.close();
bw.close();
}
}





转换流



字符编码和字符集


编码: 字符 -> 字节 'a' -> 97

解码: 字节 -> 字符 97 -> 'a'

编码表: 字符和二进制数字的对应规则

字符集和编码表: 字符集包含编码表

ASCII字符集

       ASCII编码表

ISO-8859-1字符集:

       Latin-1: 拉丁字符. 没有中文. 每个字符由1个byte组成

GB字符集

       GB2312编码表: 每个字符由2个byte组成

       GBK编码表: 每个字符由2个byte组成

       GB18030编码表: 每个字符由1, 2, 4个byte组成

Unicode

       UTF-8: ASCII字符占1个byte, 拉丁字符占2个byte, 中文占3个byte, Unicode辅助字符占4个byte

       UTF-16

       UTF-32

ANSI: 表示使用系统默认编码表


乱码原理: 字符流和转换流的关系


java.io.Reader
   |_ InputStreamReader: 转换字符输入流 读 char char[] byte -> char 97 -> 'a'
   |_ FileReader byte -UTF-8-> char
java.io.Writer char char[] String
   |_ OutputStreamWriter: 转换字符输出流 char char[] String -> byte
   |_ FileWriter char -UTF-8-> byte
FileReader=InputStreamReader+FileInputStream, 只不过固定按照IDEA中的UTF-8来将读取的字节转换为字符
FileWriter=OutputStreamWriter+FileOutputStream, 只不过固定按照IDEA中的UTF-8来将写出的字符转换为字节
字符流 = 字节流 + 编码表
转换流InputStreamReader, OutputStreamWriter在读写时, 可以指定按照哪个编码表来进行转换

java.io.OutputStreamWriter类: 输出转换流. 字符流通往字节流的桥梁
// 构造方法
OutputStreamWriter(OutputStream out): 使用默认编码表创建转换流
OutputStreamWriter(OutputStream out, String charsetName): 使用指定编码表创建转换流
write('a') -> "GBK" -> 97 OutputStream out -> 文件
// 使用默认UTF-8
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"));
// 使用指定的GBK
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"), "GBK");
o.write("你") -> GBK -> 7676 -> 文件
写数据: 字符流 -------> 字节流


java.io.InputStreamReader类: 输入转换流. 字节流通往字符流的桥梁
// 构造方法
InputStreamReader(InputStream in): 使用默认编码表创建转换流
InputStreamReader(InputStream in, String charsetName): 使用指定编码表创建转换流
// 使用默认UTF-8
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"));
// 使用指定的GBK
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
bbb int ch = r.read() <------GBK----------- 字节byte 989898
r.read(chs)
读数据: 字符流 <------ 字节流


[Java] 纯文本查看 复制代码
public class Test {
public static void main(String[] args) throws IOException {
// 创建输入转换流
InputStreamReader isr = new InputStreamReader(new FileInputStream("day10\\我是GBK文
件.txt"), "GBK");
// 创建输出转换流
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day10\\我是UTF_8文
件.txt"), "UTF-8");
// 循环读写: 一次读写一个字符char
int ch;
while ((ch = isr.read()) != -1) {
// 读到的字符, 经过InputStreamReader已经按照GBK转换为正确的"你好"
// 接下来交给OutputStreamWriter写出去, 写的时候会按照UTF-8转换为UTF-8的byte
osw.write(ch);
}
// 刷新并释放资源
isr.close();
osw.close();
}
}











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2