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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值