『Java』IO--字符流缓冲区

本文介绍了如何使用字符流缓冲区(BufferedReader 和 BufferedWriter)来提高文件读写效率,并展示了利用缓冲区进行文件复制的具体实例。

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

字符流的缓冲区

✔缓冲区的出现提高了数据的读写效率

✔对应类

|-------BufferedWriter

|-------BufferedReader

✔缓冲区要结合流才可以使用

✔在流的基础上对流的功能进行了增强

 

 

缓冲区的出现是为了提高流的操作效率而出现的.

所以,在创建缓冲区之前,必须要先有流对象.(流就是水滴,缓冲区就是杯子)

import java.io.*;
class BufferedDemo
{
	public static void main(String[] args)throws IOException{
		
		/*到复制
		
		//用缓冲去写入数据
		//创建一个字符写入流对象和文件关联.............
		FileWriter fw=new FileWriter("Demo.txt");
		
		//创建一个缓冲区
		BufferedWriter bufw=new BufferedWriter(fw);
		
		for(int x=1;x<6;x++){
		//先将数据写到缓冲区,最后通过刷新,再将数据刷到本地	
		bufw.write("dsfsdf"+x);
		//记住,只要用到缓冲区,就要记得刷新..写一次刷一次,相当于自动保存.停电了也不怕
		bufw.flush();
		//newLine()换行,,自动识别系统该用那个换行符
		bufw.newLine();
	}
		
		//其实关闭缓冲区,就是在关闭缓冲区中的流对象,所以,只关闭流对象所对的缓冲区即可.实际上,是在调用fw的close();
		bufw.close();
		
	
	
	
	//用缓冲区读取数据
	//创建一个读取流对象和文件相关联..............
	FileReader fr=new FileReader("Demo.txt");
	
	//为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数.
	BufferedReader bure=new BufferedReader(fr);
	
	
	//该缓冲区提供了,一次读一行的方法readLine(),方便对文本数据的获取.当返回null时,表示,
	//读到了文件的末尾返回null
	String line=null;
	while((line=bure.readLine())!=null){
		System.out.println(line);
	}
	*/
	
//用缓冲区实现复制功能
	BufferedReader bure=null;
	BufferedWriter buwr=null;
	
	try{
		
		bure=new BufferedReader(new FileReader("Demo.txt"));
		buwr=new BufferedWriter(new FileWriter("Test.txt"));
		
		String line=null;
		while((line=bure.readLine())!=null){
			buwr.write(line);
			buwr.newLine();
			buwr.flush();
		}
	}
	catch(IOException e)
	{
		throw new RuntimeException("读写失败");
	}
	finally{
		try{
			if(bure!=null){
				bure.close();
			}
		}
		catch(IOException e){
				throw new RuntimeException("读取关闭失败");
			} 
			
			try{
				if(buwr!=null)
				 buwr.close();
			}
			catch(IOException e){
				throw new RuntimeException("写入关闭失败");
			}
		}
	
	}
}

 

//自己定义的缓冲类(装饰类)

 

//实现读一行功能ReaderLine

 

 

 

.装饰设计模式:

当想要对己有的对象进行功能增强时,

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.

那么自定义的该类成为装饰类.

装饰类通常会通过构造方法接受被装饰的对象并基于被装饰对像的功能,提供更强的功能

 

 

 

BufferedReader的子类LineNumberReader

 

 

 

代码演示:

以下是模拟:

 

### Java IO中的字符流高级特性 #### 文件读写操作优化 为了提高文件读写的效率,在处理大文件时可以采用缓冲机制。`BufferedReader` 和 `BufferedWriter` 是两个常用的带缓存功能的字符流类,它们能够显著减少磁盘I/O次数并提升性能[^1]。 ```java try (BufferedReader reader = new BufferedReader(new FileReader("input.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = reader.readLine()) != null) { writer.write(line); writer.newLine(); } } catch (IOException e) { System.err.println(e.getMessage()); } ``` 此代码片段展示了如何利用带有内部缓冲区字符流来高效地复制文本文件的内容。通过这种方式不仅可以加快速度而且简化了程序逻辑结构。 #### 编码转换支持 当涉及到不同编码格式之间的相互转化时,可以通过指定构造函数参数的方式创建相应的字符流对象。例如: ```java InputStream inputStream = new FileInputStream("sourceFile"); Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); OutputStream outputStream = new FileOutputStream("targetFile"); Writer writer = new OutputStreamWriter(outputStream, StandardCharsets.ISO_8859_1); ``` 上述例子说明了怎样设置特定字符集以确保正确解析源文件并将目标文件保存为期望的编码形式[^3]。 #### 自定义过滤器 除了标准库提供的各种实用工具外,还可以继承自抽象基类如 `FilterReader` 或者 `FilterWriter` 来构建自己的特殊用途字符流处理器。这允许开发者根据实际需求定制化数据传输过程中的行为模式。 ```java public class CustomFilterReader extends FilterReader { protected CustomFilterReader(Reader in) { super(in); } @Override public int read() throws IOException { // 实现自定义读取逻辑... return super.read(); } // 可能还有其他重载的方法... } // 使用方式如下: CustomFilterReader customReader = new CustomFilterReader(new FileReader("file.txt")); int data; while((data=customReader.read())!=-1){ // 处理来自自定义过滤器的数据... } ``` 这段示例表明了扩展已有API的可能性以及灵活性,使得应用程序能够在必要时候获得更强大的控制力和适应能力[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值