内容先览
- 1字符编码
- 2字符流
- 2.1字符流的父类
- 2.2字符字节流
- 2.2.1FileWriter
- 2.2.2FileReader
- 2.3字符过滤流
- 2.3.1 BufferedWriter
- 2.3.2 PrintWriter
- 2.3.3 BufferedReader
- 3.字符节点流
- 3.1桥转换流
- 3.1.1InputStreamReader
- 3.1.2OutputStreamWriter
- 3.2使用步骤
1字符编码
- IOS-8859-1 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯、希伯来语对应的文字符号
- UTF-8 针对Unicode的可变长度字符编码 常用
- GB2312 简体中文
- GBK简体中文、扩充
- BIG5 台湾,繁体中文
- 编码和解码不一致时会导致
public class TestEncoding {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "你好世界123abc";
byte[] bs = str.getBytes("GBK");
String str2 = new String(bs,"BIG5");
byte[] bs2 = str2.getBytes("BIG5");
String str3 = new String(bs2,"GBK");
System.out.println(str3);
String s1 = "你好陶喆abc123";
byte[] b = s1.getBytes("UTF-8");
String s2 = new String(b,"UTF-8");
System.out.println(s2);
}
}
2字符流
2.1字符流的父类
2.1.1Reader
- 读取字符流的抽象类。这一类必须实现的唯一方法是读(char [],int,int)和()。大多数子类,但是,将重写这里定义的一些方法,以提供更高的效率,额外的功能,或两者都有。
- 构造方法
- 是字符流的顶级父类

- 常用方法
abstract void close()
关闭流并释放与它相关联的任何系统资源。
void mark(int readAheadLimit)
标记流中的当前位置。
boolean markSupported()
告诉这是否流支持的mark()操作。
int read()
读取单个字符。
int read(char[] cbuf)
将字符读入一个数组。
abstract int read(char[] cbuf, int off, int len)
将字符读入一个数组的一部分。
int read(CharBuffer target)
试图将字符读入指定的字符缓冲区中。
boolean ready()
告诉是否该流已准备好阅读。
void reset()
重置流。
long skip(long n)
跳过的字符。
2.1.2Writer
- 是字符流的顶级父类
- 用于写入到字符流的抽象类。这一类必须实现的唯一方法是写(char [],int,int),flush(),和()。大多数子类,但是,将重写这里定义的一些方法,以提供更高的效率,额外的功能,或两者都有。
- 构造方法

- 普通方法
Writer append(char c)
将指定的字符到这个作家。
Writer append(CharSequence csq)
将指定的字符序列,这个作家。
Writer append(CharSequence csq, int start, int end)
添加一个序列指定的字符序列,这个作家。
abstract void close()
关闭流,冲洗它。
abstract void flush()
冲流。
void write(char[] cbuf)
写一个字符数组。
abstract void write(char[] cbuf, int off, int len)
写入一个字符数组的一部分。
void write(int c)
写一个字符。
void write(String str)
写一个字符串。
void write(String str, int off, int len)
写入字符串的一部分。
2.2 字符节点流
2.2.1FileWriter
- 用于写入字符文件的方便类。该类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的
- 是Writer的实现子类
- 构造方法

- 普通方法(常用)
public void write(String str)
2.2.2FileReader
- 是InputStreamReader的实现子类
- 是Reader的孙子类
- 构造方法

- 普通方法(常用)
public int read(char[] c)
public class TestWriter {
public static void main(String[] args) throws Exception{
FileWriter fWriter = new FileWriter("./src/txt/target.txt");
fWriter.write("Hello今天天气好\n\r");
fWriter.write("Hello今天天气好");
char[] chars = new char[] {'你','好','嘛'};
fWriter.write(chars);
fWriter.flush();
fWriter.close();
FileReader fileReader = new FileReader("./src/txt/target.txt");
char[] cache = new char[5];
int n;
while ((n = fileReader.read(cache))!=-1) {
for (int i = 0; i < n; i++) {
System.out.print(cache[i]);
}
System.out.println("");
}
}
}
2.3字符过滤流
2.3.1BufferedWriter
- 支持换行符
- newLine()方法换行 可一次写一行、读一行
- 构造方法

- 普通方法
void close()
关闭流并释放与它相关联的任何系统资源。
Stream<String> lines()
返回一个 Stream,其中的元素是线从这 BufferedReader读。
void mark(int readAheadLimit)
标记流中的当前位置。
boolean markSupported()
告诉这是否流支持的mark()操作,它。
int read()
读取单个字符。
int read(char[] cbuf, int off, int len)
将字符读入一个数组的一部分。
String readLine()
读一行文本。
boolean ready()
告诉是否该流已准备好阅读。
void reset()
将流到最近的标记。
long skip(long n)
跳过的字符。
2.3.2 PrintWriter
- 跟BufferedWriter类似但是比BufferedWriter使用更广泛因为其就有pringln()方法取代了BufferedWriter麻烦的nextLine()方法
- Writer类的直接实现类(子类)
- 构造函数

- 普通方法
PrintWriter append(char c)
将指定的字符到这个作家。
PrintWriter append(CharSequence csq)
将指定的字符序列,这个作家。
PrintWriter append(CharSequence csq, int start, int end)
添加一个序列指定的字符序列,这个作家。
boolean checkError()
刷新流如果不是封闭的,检查它的错误状态。
protected void clearError()
清除此流的错误状态。
void close()
关闭流并释放与它相关联的任何系统资源。
void flush()
冲流。
PrintWriter format(Locale l, String format, Object... args)
使用指定的格式字符串和参数将格式化的字符串写入到这个写作者。
PrintWriter format(String format, Object... args)
使用指定的格式字符串和参数将格式化的字符串写入到这个写作者。
void print(boolean b)
打印布尔值。
void print(char c)
打印一个字符。
void print(char[] s)
打印一个字符数组。
void print(double d)
打印一个双精度浮点数。
void print(float f)
打印一个浮点数。
void print(int i)
打印一个整数。
void print(long l)
打印一个长整数。
void print(Object obj)
打印一个对象。
void print(String s)
打印一个字符串。
PrintWriter printf(Locale l, String format, Object... args)
使用指定的格式字符串和参数编写格式化字符串的方便方法。
PrintWriter printf(String format, Object... args)
使用指定的格式字符串和参数编写格式化字符串的方便方法。
void println()
通过编写行分隔符终止当前行。
void println(boolean x)
打印一个布尔值,然后终止该行。
void println(char x)
打印一个字符,然后终止行。
void println(char[] x)
打印一个字符数组,然后终止行。
void println(double x)
打印一个双精度浮点数,然后终止行。
void println(float x)
打印一个浮点数,然后终止该行。
void println(int x)
打印一个整数,然后终止行。
void println(long x)
打印一个长整数,然后终止行。
void println(Object x)
打印一个对象,然后终止该行。
void println(String x)
打印一个字符串,然后终止行。
protected void setError()
指示发生了一个错误。
void write(char[] buf)
写一个字符数组。
void write(char[] buf, int off, int len)
写入一个字符数组的一部分。
void write(int c)
写一个字符。
void write(String s)
写一个字符串。
void write(String s, int off, int len)
写入字符串的一部分。
2.3.3BufferedReader
- 能够读取一行
- 构造函数

- 普通方法
void close()
关闭流并释放与它相关联的任何系统资源。
Stream<String> lines()
返回一个 Stream,其中的元素是线从这 BufferedReader读。
void mark(int readAheadLimit)
标记流中的当前位置。
boolean markSupported()
告诉这是否流支持的mark()操作,它。
int read()
读取单个字符。
int read(char[] cbuf, int off, int len)
将字符读入一个数组的一部分。
String readLine()
读一行文本。
boolean ready()
告诉是否该流已准备好阅读。
void reset()
将流到最近的标记。
long skip(long n)
跳过的字符。
BufferedReader、PrintWriter、BufferedWriter 综合示例
public class TestConverStream1 {
public static void main(String[] args) throws Exception{
OutputStream ops = new FileOutputStream("./src/txt/target.txt");
OutputStreamWriter osw= new OutputStreamWriter(ops,"UTF-8");
PrintWriter pWriter = new PrintWriter(osw);
pWriter.println("你好世界");
pWriter.close();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/txt/target.txt"),"UTF-8"));
String n;
while ((n = br.readLine())!=null) {
System.out.println(n);
}
}
}
3.字符节点流
3.1桥转换流
- 将字节流包装转换成字符流
- 在转换期间可以转换改变编码
3.1.1 InputStreamReader
- Reader直接子类(实现类)
- 构造方法

- 普通方法
void close()
关闭流并释放与它相关联的任何系统资源。
String getEncoding()
返回此流使用的字符编码的名称。
int read()
读取单个字符。
int read(char[] cbuf, int offset, int length)
将字符读入一个数组的一部分。
boolean ready()
告诉是否该流已准备好阅读。
3.1.2 OutputStreamWriter
- Writer直接实现类(子类)
- 构造方法

- 普通方法
void close()
关闭流,冲洗它。
void flush()
冲流。
String getEncoding()
返回此流使用的字符编码的名称。
void write(char[] cbuf, int off, int len)
写入一个字符数组的一部分。
void write(int c)
写一个字符。
void write(String str, int off, int len)
写入字符串的一部分。
3.2使用步骤
- 创建节点流
- 创建过滤流,设置字符编码集
- 封装字符过滤流
- 读写数据
- 关闭流
[注意:读取同一个文件时候编码要设置一致]
InputStreamReader、 OutputStreamWriter 综合示例
public class Test {
public static void main(String[] args) throws Exception{
OutputStream ops = new FileOutputStream("./src/txt/target.txt");
OutputStreamWriter osw= new OutputStreamWriter(ops,"UTF-8");
PrintWriter pWriter = new PrintWriter(osw);
pWriter.println("你好世界");
pWriter.close();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/txt/target.txt"),"UTF-8"));
String n;
while ((n = br.readLine())!=null) {
System.out.println(n);
}
}
}