Chp20-IO2-字符流
操作char|String类型的数据
流对象的创建方式与路径的书写和字节流一致
输入流
- Reader: 抽象父类
- FileReader: 字符输入节点流, 是Reader的子类
常用方法
- int read(): 读取一个字符, 读取到达末尾返回-1
- int read(char[] ): 尝试读取一个数组的数据至数组中, 返回实际读取个数, 读取到达末尾返回-1
package com.by.test;
import java.io.FileReader;
public class Test_FR {
public static void main(String[] args) {
try (
FileReader fr=new FileReader("file/a.txt")
) {
//循环读取文件所有内容-read()
while (true) {
int n = fr.read();
if (n == -1) {
break;
}
System.out.println((char) n);
}
//循环读取文件所有内容-read(char[] )
while (true) {
char[] cs = new char[3];
int n = fr.read(cs);
if (n == -1) {
break;
}
//遍历数组输出
for (char c : cs) {
System.out.print(c);
}
}
} catch (Exception e) {
System.out.println("未知异常!");
e.printStackTrace();
}
}
}
输出流
- Writer: 抽象父类
- FileWriter: 字符输出节点流, Writer的子类
常用方法
- write(int ): 写入一个字符
- write(String ): 写入一个字符串
package com.by.test;
import java.io.FileReader;
import java.io.FileWriter;
public class Test_FW {
public static void main(String[] args) {
try (
FileWriter fw=new FileWriter("file/a.txt")
) {
//写入单个字符
fw.write(65);
fw.write(66);
fw.write(67);
//写入一个字符串
fw.write("这是一个字符串");
System.out.println("写入成功!");
} catch (Exception e) {
System.out.println("未知异常!");
e.printStackTrace();
}
}
}
缓冲过滤流
输入缓冲过滤流
BufferedReader br=new BufferedReader(fr对象);
常用方法
- String readLine(): 读取一行的内容, 读取到达末尾返回null
package com.by.test;
import java.io.BufferedReader;
import java.io.FileReader;
public class Test_BR {
public static void main(String[] args) {
try (
FileReader fr=new FileReader("file/a.txt");
//添加缓冲过滤流
BufferedReader br=new BufferedReader(fr)
) {
//循环读取所有内容
while (true) {
//接收本次读取内容
String str = br.readLine();
//判断读取是否到达末尾
if (str == null) {
break;
}
//输出查看本次读取内容
System.out.println(str);
}
} catch (Exception e) {
System.out.println("未知异常!");
e.printStackTrace();
}
}
}
输出缓冲过滤流
PrintWriter pw=new PrintWriter(fw对象);
BufferdWriter中的方法不够实用, 更推荐使用拥有众多独有方法的PrintWriter
常用方法
- print(值): 向目标文件写入一个数据, 默认不换行
- println(值): 向目标文件写入一个数据, 默认换行
- println(): 向目标文件写入一个空行
package com.by.test;
import java.io.FileWriter;
import java.io.PipedWriter;
import java.io.PrintWriter;
public class Test_PW {
public static void main(String[] args) {
try (
FileWriter fw=new FileWriter("file/a.txt");
//添加缓冲过滤流
PrintWriter pw=new PrintWriter(fw)
) {
pw.print("abcd");
pw.print("ABCD");
pw.println();
pw.println();
pw.println("abcd");
pw.println("ABCD");
System.out.println("写入成功!");
} catch (Exception e) {
System.out.println("未知异常!");
e.printStackTrace();
}
}
}
如何理解输出语句?
System是类库中的一个系统类, out为该类中的一个静态属性, 属性类型为PrintStream标准输出流对象类型, print()&println()是该流中的方法
- PrintWriter和PrintStream中的方法有什么区别?
- PrintWriter是通过方法将数据写入到目标文件
- PrintStream是通过方法将数据写入到内部控制台
字符编码集:
编码: 将原内容转换为数字的过程
解码: 将数字转换为原内容的过程
- 特点: 不同的编码集编解码的方式不同
常见的编码集:
- GBK: 简体中文
- Big5: 繁体中文
- ASC||: 美式编码
- ISO-8859-1: 西欧
- Unicode:
- UTF-16: java默认编码集, 所有内容同一占用2个字节
- UTF-8: 行业标准. 占用字节大小由内容大小而定, 可以为1-3个字节
桥转换流
作用为将字节流转换为字符流并设置转换过程中的编码集
输入:
InputStreamReader isr=new InputStreamReader(fis对象,"编码集");
输出:
OutputStreamWriter osw=new OutputStreamWriter(fos对象,"编码集");
为了方便使用, 通常会为桥转换流添加缓冲过滤流, 方便使用缓冲过滤流中的独有方法
使用
当对同一文件进行读写操作时, 必须保证读写时的编码集保持一致, 否则会乱码
package com.by.test;
import java.io.*;
/**
* 桥转换流-先写后读演示
*/
public class Test {
public static void main(String[] args) {
try (
//输出桥转换流-以GBK的编码方式往b.txt中写入数据
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("file/b.txt"), "GBK");
//输入桥转换流-以GBK的编码方式读取b.txt中的内容
InputStreamReader isr=new InputStreamReader(new FileInputStream("file/b.txt"),"GBK");
//添加缓冲过滤流
PrintWriter pw=new PrintWriter(osw);
BufferedReader br=new BufferedReader(isr)
) {
//先写
pw.println("一二三四五");
pw.println("上山打老虎");
pw.println("...");
//强刷缓冲区
pw.flush();
//后读
while (true) {
String str = br.readLine();
if (str == null) {
break;
}
System.out.println(str);
}
} catch (Exception e) {
System.out.println("未知异常!");
e.printStackTrace();
}
}
}