java学习笔记(17):IO流之转换流与缓冲流

转换流

一、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)
//该方法只返回行的有效的字符,但不会自动帮你换行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值