【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

相关推荐
Lin_Coder_10 分钟前
Python入门 — 类
开发语言·python
似水এ᭄往昔13 分钟前
【c语言】字符函数和字符串函数(1)
c语言·开发语言
laimaxgg26 分钟前
Qt常用控件之多行输入框QTextEdit
开发语言·c++·qt·qt5·qt6.3
楠枬35 分钟前
网页五子棋——项目测试
java·功能测试·spring
数据知道38 分钟前
python中httpx库的详细使用及案例
开发语言·爬虫·python·httpx
go546315846539 分钟前
基于Matlab实现汽车远近光灯识别的详细步骤及代码示例
开发语言·matlab·汽车
软件黑马王子1 小时前
C#初级教程(6)——函数:从基础到实践
开发语言·c#
患得患失9491 小时前
【前端】【面试】【树】JavaScript 树形结构与列表结构的灵活转换:`listToTree` 与 `treeToList` 函数详解
开发语言·前端·javascript·tree·listtotree·treetolist
胡图蛋.1 小时前
Spring MVC的执行流程步骤
java·spring
sevevty-seven1 小时前
spring MVC执行流程
java·开发语言·spring