【Java】I/O 流篇 —— 缓冲流

目录

缓冲流

字节缓冲流

字节缓冲流就是底层自带了缓冲区的字节流,提高了读取/写入的性能

构造方法

  • BufferedInputStream 字节缓冲输入流

    • public BufferedInputStream(InputStream is) 把基本流包装成高级流,提高读取数据的性能,缓冲区大小默认为 8129
    • public BufferedInputStream(InputStream is,int size) 把基本流包装成高级流,提高读取数据的性能,并指定缓冲区大小
  • BufferedOutputStream 字节缓冲输出流

    • public BufferedOutputStream(OutputStream os) 把基本流包装成高级流,提高写入数据的性能,缓冲区大小默认为 8129
    • public BufferedOutputStream(OutputStream os,int size) 把基本流包装成高级流,提高写入数据的性能,并指定缓冲区大小

代码示例

java 复制代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
	public static void main(String[] args) throws IOException  {
		
		// 创建对象
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("aaa.txt"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bbb.txt"));
		
		// 复制数据
		int chr;
		while((chr = bis.read()) != -1) {
			bos.write(chr);
		}
		
		/* 
		 * byte[] bytes = new byte[1024];
		 * int len;
		 * while((len = bis.read(bytes)) != -1){
		 * 		bos.write(bytes,0,len);
		 * }
		 */
		
		// 释放资源
		bos.close();
		bis.close();
	}
}

原理

以下是原理图:

  1. 如果用的是空参 read 方法
    • 变量 ch 作为两个缓冲区之间的临时存储空间,一个字节一个字节的将数据从输入流的缓冲区传到输出流的缓冲区
  2. 如果用的是有参 read 方法
    • 字节数组 bytes 作为两个缓冲区之间的临时存储空间,将数组长度的字节数据从输入流的缓冲区传到输出流的缓冲区

字符缓冲流

字符缓冲流就是底层自带了缓冲区的字符流,提高了读取/写入的性能

构造方法

  • BufferedReader 字符缓冲输入流

    • BufferedReader(Reader r)
    • BufferedReader(Reader r,int size)
  • BufferedWriter 字符缓冲输出流

    • BufferedWriter(Writer w)
    • BufferedWriter(Writer w,int size)

readLine()

字符缓冲输入流的特有方法:

public String readLine() 读取一行数据,如果没有数据可读,返回 null

代码示例:

  1. 读取一行数据:

    java 复制代码
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class Demo {
    	public static void main(String[] args) throws IOException  {
    		
    		// 创建对象
    		BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
    		
    		// 读取数据
    		String line = br.readLine();
    		System.out.println(line);
    		
    		// 释放资源
    		br.close();
    	}
    }

    注意事项:readLine 方法一次读取一整行数据,遇到回车换行结束,但是不会把回车换行读取到内存当中

  2. 循环读取

    java 复制代码
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class Demo {
    	public static void main(String[] args) throws IOException  {
    		
    		// 创建对象
    		BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
    		
    		// 读取数据
    		String line;
    		while((line = br.readLine()) != null) {
    			System.out.println(line);
    		}
    		
    		// 释放资源
    		br.close();
    	}
    }

newLine()

字符缓冲输出流的特有方法:

public void newLine() 跨平台的换行

代码示例:

java 复制代码
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Demo {
	public static void main(String[] args) throws IOException {
		// 创建对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
		
		// 写入数据
		bw.write("月色真美");
		bw.newLine();
		bw.write("跟你一样");
		
		// 释放资源
		bw.close();
	}
}

注意事项:如果要开追加模式(续写),true 应该加在 FileWriter 里面,因为 BufferedWriter 没有这个模式

缓冲区

虽然字节缓冲流和字符缓冲流的缓冲区长度都为 8192,但是字节缓冲流的是 8192 个字节,是 byte 类型的,占内存 8K,而字符缓冲流的是 8192 个字符,是 char 类型的,占内存 16K

相关推荐
萧瑟余晖13 分钟前
Spring Batch核心模型与快速上手详解
java·spring·batch
缓慢更新38 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师1 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮1 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放2 小时前
Python基础语法练习题(75)
开发语言·python·学习
starzy19903 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala
wangbing11253 小时前
平台介绍-modbus设备调试
java
starzy19904 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala