10.2.6 字节缓冲流&&字符缓冲流

本文详细介绍了字节缓冲流(BufferedInputStream/BufferedOutputStream)和字符缓冲流(BufferedReader/BufferedWriter)的使用方法及原理,通过实例展示了如何利用缓冲流提高文件复制和文本读写的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

####################字节缓冲流####################

BufferedInputStream以及BufferedOutputStream
1 缓冲流提升了性能
2 最底层一定是节点流
3 释放的时候只需要释放外层的数据流,内部会自动释放,如果想一个个释放,则从里到外依次释放
现在我们看一下API
A BufferedInputStream为另一个输入流添加了新功能,即缓冲输入并支持mark和reset方法的功能,创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。mark操作会记住输入流中的一个点,并且reset操作会导致从最近的mark操作读取的所有字节在从包含的输入流中取出新字节之前重新读取。
缓冲区默认为8K,可以自己指定;
BufferedInputStream(InputStream in,int size):创建具有缓冲区大小的BufferedInputStream,并保存其参数,输入流in供以后使用;
我们利用之前的的COPY代码进行改进以阐述字节缓冲流的作用;
关键就是这么一行代码:

InputStream is=new BufferedInputStream(new FileInputStream(src));  //不需要套很多层
OutputStream os=new BufferedOutputStream(new FileOutputStream(dest,true));

给源代码加上一个皮,就可以使效率大大提高;下面是完整代码:

package com.sxt.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 文件拷贝:文件字节输入、输出流
 * @author 韩文韬
 *
 */
public class copy {
	public static void main(String[] args) {
		long t1=System.currentTimeMillis();
		copy("IO技术.mp4","IO-copy.mp4");
		long t2=System.currentTimeMillis();
		System.out.println(t2-t1);
	}
	/**
	 * 文件的拷贝
	 * 思考:利用递归进行文件夹的拷贝
	 * @param hanPath
	 * @param wenPath
	 */
	public static void copy(String hanPath,String wenPath) {
		//1.创建源
		File src=new File(hanPath);  //源头
		File dest=new File(wenPath); //目的地
		//2.选择流
		try (InputStream is=new BufferedInputStream(new FileInputStream(src));  //不需要套很多层
			OutputStream os=new BufferedOutputStream(new FileOutputStream(dest,true));)
			//3.操作(分段读取)
			{
			byte[] flush=new byte[1024]; //缓冲容器
			int len=-1;                  //接受长度
			while((len=is.read(flush))!=-1)
			{
				os.write(flush, 0, len); //分段写出
			}
			os.flush();
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

输出结果为:12
不加BufferedInputStream/BufferedOutputStream之前输出结果为57,由此可见,大大提升了效率!

####################字符缓冲流####################

处理的是字符,也就是纯文本;
BufferedReader: 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取;
String readLine() 读一行文字(内部自动找换行符);
BufferedWriter: 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入;
void newLine() 写一行行分隔符;
1 向文件字符输入流中加入字符缓冲流

package com.sxt.io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 四个步骤:分段读取 文件字符输入流 加入字符缓冲流
 * 1.创建源 2.选择流 3.操作(写出内容) 4.释放资源
 * @author 韩文韬
 *
 */
public class BufferedTest03 {
	public static void main(String[] args) {
		//1.创建源
		File src=new File("han.txt");
		//2.选择流
		try (BufferedReader reader=new BufferedReader(new FileReader(src));) 
			{
			//3.操作(分段读取)
			String line=null;
			while((line=reader.readLine())!=null)  //逐行读取
			{
				//字符数组--->字符串
				System.out.println(line);
			}
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}

输出结果为:
hanwentao
加油华为
可见,读取操作时修改较大,应仔细观看
2 向文件字节输出流中加入字符缓冲流

package com.sxt.io;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 文件字节输出流 加入字符缓冲流
 * 1.创建源 2.选择流 3.操作(写出内容) 4.释放资源
 * @author 韩文韬
 *
 */
public class BufferedTest04 {
	public static void main(String[] args) {
		//1.创建源
		File dest=new File("wen.txt");
		//2.选择流
		try(BufferedWriter writer=new BufferedWriter(new FileWriter(dest));) //后面的true或false表示追加文件
			//操作(写出)
			//写法一
//			String msg="i love hanwentao\r\n我爱哈利路亚";  //换行
//			char[] datas=msg.toCharArray();  //字符串--->字符数组
//			writer.write(datas, 0, datas.length);
			//写法二
//			String msg="IO is so easy\r\n尚学堂欢迎你";
//			writer.write(msg);
			//写法三
		{
			writer.append("IO is so difficult\r\n");
			writer.newLine();
			writer.append("尚学堂讨厌你");
			writer.flush();
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}

中间加入了

writer.newLine();

目的是为了换行而已;
现在来完成一个copy文本的办法:

package com.sxt.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 文件拷贝:文件字节输入、输出流
 * @author 韩文韬
 *
 */
public class copyTxt {
	public static void main(String[] args) {
		copy("han.txt","han-copy.txt");
	}
	/**
	 * 文件的拷贝
	 * 思考:利用递归进行文件夹的拷贝
	 * @param hanPath
	 * @param wenPath
	 */
	public static void copy(String hanPath,String wenPath) {
		//1.创建源
		File src=new File(hanPath);  //源头
		File dest=new File(wenPath); //目的地
		//2.选择流
		try (BufferedReader br=new BufferedReader(new FileReader(src));  //不需要套很多层
			BufferedWriter bw=new BufferedWriter(new FileWriter(dest));)
			{
			//3.操作(分段读取)
			String line=null;
			while((line=br.readLine())!=null)
			{
				bw.write(line);
				bw.newLine();
			}
			bw.flush();
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

该小节结束~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值