IO(输入_输出)3——转换流、缓冲流

本文详细介绍了Java中的转换流,包括OutputStreamWriter(输出字符流)和InputStreamReader(输入字符流),用于解决读写文件时可能出现的中文乱码问题。同时,文章讲解了缓冲流的概念,特别是字节缓冲流(BufferedOutputStream和BufferedInputStream)和字符缓冲流(BufferedReader和BufferedWriter),阐述了它们如何提高IO流的读写速度。还提及了如何使用缓冲流进行文件复制以及处理IO异常的方法。
摘要由CSDN通过智能技术生成

转换流

使用场景:读写文件时,中文乱码的问题

为什么产生中文乱码问题?编码和解码时使用的码表不一致

编码:符号——>码值

解码:码值——>符号

输出字符流:OutputStreamWriter

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。
在这里插入图片描述

public class Demo{
   
	public static void main(String[] args) throws IOException {
   
FileOutputStream fos=new FileOutputStream("UTF-8_1.txt");//OutputStreamWriter需要字节输出流
		OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");	
		osw.write("你好");
		osw.close();
	}
}

OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?

其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

输入字符流:InputStreamReader

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
在这里插入图片描述

public class Demo {
   
	public static void main(String[] args) throws IOException{
   
	  FileInputStream fis=new FileInputStream("UTF-8_2.txt");
	  InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
	  int ch;
	  while((ch=isr.read())!=-1){
   
		  System.out.println((char)ch);
	  }
	  isr.close();
	}
}

缓冲流

Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度

缓冲流,根据流的分类分类为字节缓冲流与字符缓冲流。

字节缓冲流

字节缓冲流根据流的方向,共有2个

  • 写入数据到流中,字节缓冲输出流 BufferedOutputStream

  • 读取流中的数据,字节缓冲输入流 BufferedInputStream

它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度

字节缓冲输出流BufferedOutputStream

通过字节缓冲流,进行文件的读写操作 写数据到文件的操作

  • 构造方法

public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*高效字节流
 *  高效字节输出流  
 *    OutputStream 
 *       BufferedOutputStream
 *  构造方法:
 *    BufferedOutputStream(OutputStream out) 
	 成员方法:
	 void write(int b) 
	 void write(byte[] b) 
	 void write(byte[] b, int off, int len) 
     
     BufferedOutputStream原理:
                   底层使用了一个长度为8192的字节数组,我们再利用write写数据的时候都会写到
                  底层的字节数组中,我们可以通过手动刷新(将字节数组中的内容刷到文件)或者关流
        (关流包含:先刷新在关流)
 */
public class Demo {
   
	public static void main(String[] args)throws IOException{
   
      //method01();	
	  // method02();
		FileOutputStream fos=new FileOutputStream("buffer.txt");
		 BufferedOutputStream bos = new BufferedOutputStream(fos);
		 byte[] bArr={
   98,99,100,101,102};		 
		 bos.write(bArr, 2, 2);		 
		 bos.close();
	}
	private static void method01() throws FileNotFoundException, IOException {
   
		  //1.需要创建一个字节流对象关联文件
			FileOutputStream fos=new FileOutputStream("buffer.txt");	
		 //2.对FileOutputStream进行高效
			BufferedOutputStream bos = new BufferedOutputStream(fos);		 
		 //3.向buffer.txt中写内容
			bos.write(97);
		    bos.flush();
		 //4.关流释放资源
			bos.close();
	}
    private static void method02() throws FileNotFoundException, IOException {
   
		FileOutputStream fos=new FileOutputStream("buffer.txt");		 
		BufferedOutputStream bos 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值