【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

相关推荐
云知谷10 分钟前
【经典书籍】C++ Primer 第16章模板与泛型编程精华讲解
c语言·开发语言·c++·软件工程·团队开发
独自破碎E19 分钟前
LeetCode 381: O(1) 时间插入、删除和获取随机元素 - 允许重复
java·算法·leetcode
程语有云21 分钟前
生产事故-Caffeine缓存误用之临下班的救赎
java·缓存·caffeine·阻塞·log·生产事故
workflower34 分钟前
基本作业-管理⾃⼰的源代码
开发语言·单元测试·软件工程·需求分析·个人开发
froginwe1143 分钟前
Pandas DataFrame:深入理解数据分析的利器
开发语言
Miraitowa_cheems44 分钟前
LeetCode算法日记 - Day 81: 最大子数组和
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先
Jm_洋洋1 小时前
【Linux系统编程】程序替换:execve(execl、execlp、execle、execv、execvp、execvpe)
linux·运维·c语言·开发语言·程序人生
CodeCraft Studio1 小时前
国产化Word处理控件Spire.Doc教程:用Java实现TXT文本与Word互转的完整教程
java·c#·word·spire.doc·word文档转换·txt转word·word转txt
徐子童1 小时前
数据结构---优先级队列(堆)
java·数据结构·面试题·优先级队列··topk问题
滑水滑成滑头1 小时前
**标题:发散创新:智能交通系统的深度探究与实现**摘要:本文将详细
java·人工智能·python