目录
- 编码解码问题
- 编码
- 解码
- 举例
- 字符流
- OutputStreamWriter
- 构造方法
- 举例
- 方法
- InputStreamReader
- 构造方法
- 举例
- 方法
- 复制
- FileWriter和FileReader
- 简介
- 举例
- 字符缓冲流
- BufferedWriter:字符缓冲输出流
- BufferedReader:字符缓冲输入流
- 复制文件
- 字符缓冲流的特殊方法
编码解码问题
编码
把看得懂的变成看不懂的
String -- byte[]
- 方法
byte[] getBytes(String charsetName)
使用指定的字符集合把字符串编码为字节数组
解码
把看不懂的变成看得懂的
byte[] -- String
- 方法
String(byte[] bytes,String charsetName)
通过指定的字符集解码字节数组
举例
String s = "你好";
// String -- byte[]
byte[] bys = s.getBytes();
// byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61]
// byte[] bys = s.getBytes("UTF-8"); // [-28, -67, -96, -27, -91, -67]
System.out.println(Arrays.toString(bys));
// byte[] -- String
String ss = new String(bys);
// String ss = new String(bys,"GBK");
// String ss = new String(bys,"UTF-8");
System.out.println(ss);
// 编码问题简单,只要编码解码的格式是一致的。
字符流
OutputStreamWriter
构造方法
OutputStreamWriter(OutputStream out) // 根据默认编码把字节流的数据转换为字符流
OutputStreamWriter(OutputStream out,String charsetName) // 根据指定编码把字节流转换为字符流。
// 字符流=字节流+编码表。
举例
// 创建对象
OutputStreamWriter osw = new OutputStreamWriter(new
FileOutputStream("osw.txt"),"GBK");
// 写数据
osw.write("中国");
osw.close();
方法
public void write(int c) // 写一个字符
public void write(char[] cbuf) // 写一个字符数组
public void write(char[] cbuf,int off,int len) // 写一个字符数组的一部分
public void write(String str) // 写一个字符串
public void write(String str,int off,int len) // 写一个字符串的一部分
// write之后要flush()一下,刷新缓冲区
- 面试题
面试题:close()和flush()的区别?
A: close()关闭流对象,但是先刷新一次缓冲区。关闭之后流对象不可以在使用
B: flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用
InputStreamReader
构造方法
InputStreamReader(InputStream is) // 用默认的编码读取数据
InputStreamReader(InputStream is,String charsetName) // 用指定的编码读取数据
举例
InputStreamReader isr = new InputStreamReader(new
FileInputStream("osw.txt"));
// 一次读取一个字符
int ch = 0;
while((ch=isr.read())!= -1) {
System.out.print((char)ch);
}
isr.close();
方法
int read() // 一次读取一个字符
int read(char[] chs) // 一次读取一个字符数组
- 举例
InputStreamReader isr = new InputStreamReader(new FileInputStream("StringDemo.java"));
// int ch = 0;
// while((ch=isr.read())!=-1) {
// System.out.println((char)ch);
// }
char[] chs = new char[1024];
int len = 0;
while((len = isr.read(chs))!=-1) {
System.out.println(new String(chs,0,len));
}
// 释放资源
isr.close();
复制
需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
// 封装数据源
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
// 封装目的地
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
// 读写数据
// 方式1
// int ch = 0;
// while((ch=isr.read())!=-1) {
// osw.write(ch);
// }
//
// 方式2
char[] chs = new char[1024];
int len = 0;
while ((len = isr.read(chs)) != -1) {
osw.write(chs, 0, len);
osw.flush();
}
// 释放资源
osw.close();
isr.close();
FileWriter和FileReader
简介
由于我们常见的操作都是使用本地默认编码,所以,不用指定编码,
而转换流的名称有点长,所以,java就提供了其子类供我们使用
OutputStreamWriter=FileOutputStream+编码表(GBK)
FileWriter = FileOutputStream+编码表(GBK)
InputStreamReader = FileInputStream+编码表(GBK)
FileReader=FileInputStream+编码表(GBK)
举例
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
// int ch = 0;
// while((ch=fr.read())!=-1) {
// fw.write(ch);
// }
// 一次一个字节数组
char[] chs = new char[1024];
int len=0;
while((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
fw.flush();
}
fw.close();
fr.close();
字符缓冲流
BufferedWriter:字符缓冲输出流
- 定义
将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了 - 举例
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("bw.txt")));
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
bw.write("hello");
bw.write("world");
bw.write("java");
bw.flush();
bw.close();
BufferedReader:字符缓冲输入流
- 定义
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
可以指定缓冲区的大小,或者可使用默认的大小,大多数情况下,默认值就足够大了 - 举例
// 创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
// 方式1
// int ch = 0;
// while((ch=br.read())!=-1) {
// System.out.print((char)ch);
// }
char[] chs = new char[1024];
int len = 0;
while((len=br.read(chs))!=-1) {
System.out.println(new String(chs,0,len));
}
// 释放资源
br.close();
- 子类LineNumberReader
// 方法
public int getLine() // 获取当前行号
public void setLine(int lineNumber) // 设置行号
举例
LineNumberReader lnr = new LineNumberReader(new FileReader("my.txt"));
// 从10开始才比较好
lnr.setLineNumber(10);
String line = null;
while((line=lnr.readLine())!=null) {
System.out.println(lnr.getLineNumber()+line);
}
lnr.close();
复制文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
// 两种方式
char[] chs = new char[1024];
int len= 0;
while((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
bw.flush();
}
// 释放资源
bw.close();
br.close();
字符缓冲流的特殊方法
public void newLine() // 根据系统来决定换行符
public String readLine() // 一次读取一行数据
举例
- Read方法
private static void read() throws IOException {
// 创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("bw2.txt"));
String line = null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
- Write方法
private static void write() throws IOException {
// 创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));
for (int x = 0; x < 10; x++) {
bw.write("hello" + x);
// bw.write("\r\n");
bw.newLine();
bw.flush();
}
bw.close();
}
复制举例
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();