文章目录
转换流
一、OutputStreamWriter(继承Writer类)
- 字符流通向字节流的桥梁
- 构造方法:
构造方法1:
OutputStreamWriter(OutputStream out) //接收所有的字节流输出,默认GBK编码表
构造方法2:
OutputStreamWriter(OutputStream out,String charsetName) // charsetName是编码表的名字(GBK、UTF-8),名称不区分大小写
- 举例如下
public static void writeCN() throws Exception {
//创建与文件关联的字节输出流对象
FileOutputStream fos = new FileOutputStream("c:\\cn8.txt");
//创建可以把字符转成字节的转换流对象,并指定编码
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
//调用转换流,把文字写出去,其实是写到转换流的缓冲区中
osw.write("你好");//写入缓冲区。
osw.close();
}
二、IntputStreamReader(继承Reader类)
- 字节向字符流转换的桥梁
- 构造方法:
构造方法1:
IntputStreamReader(IntputStream in) //默认GBK编码表
构造方法2:
IntputStreamReader(IntputStream in,String charsetName) // charsetName是编码表的名字(GBK、UTF-8),名称不区分大小写
- 举例如下
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//演示字节转字符流的转换流
readCN();
}
public static void readCN() throws IOException{
//创建读取文件的字节流对象
InputStream in = new FileInputStream("c:\\cn8.txt");
//创建转换流对象
//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
InputStreamReader isr = new InputStreamReader(in,"utf-8");
//使用转换流去读字节流中的字节
int ch = 0;
while((ch = isr.read())!=-1){
System.out.println((char)ch);
}
//关闭流
isr.close();
}
}
三、OutputStreamWriter和FileWriter、InputStreamReader和FileReader的区别
- OutputStreamWriter和InputStreamReader的原理为:字节流+编码表。而他们各自的子类FileWriter和FileReader只能使用默认的编码表
- 字节→字符:看不懂→看得懂。需要读(用输入流InputStreamReader)
- 字符→字节:看得懂→看不懂。需要写(用输出流OutputStreamReader)
缓冲流
一、字节缓冲流
是用来提高字节流的效率。
字节缓冲输出流(BufferedOutputStream)
- 举例如下
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("f:\\a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos); //可以传递任意的字节输出流,传递的是啥,就对哪个字节流提高效率
bos.write(55); //写一个字节
byte[] bytes = "hello".getBytes();
bos.write(bytes); //写字节数组
bos.write(bytes,2,2); //写字节数组的一部分
bos.close();
}
}
- 运行结果(下一次写入不会覆盖上一次写的)
字节缓冲输入流(BufferedInputStream)
- 举例如下
private static void read() throws IOException {
FileInputStream fileIn = new FileInputStream("abc.txt");
//把基本的流包装成高效的流
BufferedInputStream in = new BufferedInputStream(fileIn);
int ch = -1;
while ( (ch = in.read()) != -1 ) {
System.out.print((char)ch);
}
in.close();
}
二、字符缓冲流
- 字符输出流有BufferedWriter和BufferedReader
- 字符缓冲流和字节缓冲十分相似。
- BufferedWriter有一个特有的方法
写换行:
void newLine() //一种换行符,具有平台无关性,windows和linux通用
- BufferedReader有一个特有的方法
读取文本行:
String readLine() //读取文本行(依靠文本中的“\r\n”来判断一行是否结束,如果读取到流的末尾,会返回一个null)
//该方法只返回行的有效的字符,但不会自动帮你换行