欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVAEE细细看 进阶 12 - IO、 字符流

程序员文章站 2024-03-07 14:41:09
...

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种方式

JAVAEE细细看 进阶 12 - IO、 字符流

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种方式

JAVAEE细细看 进阶 12 - IO、 字符流

回忆下,
字节流写数据:一次写一个字节的数据,或者一次写一个字节数组的数据
字节流读数据:一次写一个字符的数据,或者一次写一个字符数组的数据

字符流写数据,一个字符,字符数组,字符串等
字符流读数据,一个字符,一个字符数组

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

七. 字符缓存流

贴图

JAVAEE细细看 进阶 12 - IO、 字符流
还是复制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();