java 字符缓冲流BufferedReader和BufferedWriter

2023-12-30 09:58

本文主要是介绍java 字符缓冲流BufferedReader和BufferedWriter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节概要:

目录

BufferedReader

BufferedWriter

字符缓冲流复制文本文件:


BufferedReader

继承自Reader

构造方法:

     private static int defaultCharBufferSize = 8192;
//可以手动设置缓存去char数组的大小public BufferedReader(Reader in, int sz) {super(in);if (sz <= 0)throw new IllegalArgumentException("Buffer size <= 0");this.in = in;cb = new char[sz];nextChar = nChars = 0;}//创建一个char数组,大小为8192,用来缓存public BufferedReader(Reader in) {this(in, defaultCharBufferSize);}

工作过程:使用BufferedReader时,先从Reader对象(FileReader)中读取数据写入到char[],然后从 自身的char数组中访问数据,当char数组的数据被访问完毕,就调用fill()方法重新填充char数组。关闭BufferedReader时,其构造参数的Reader也被关闭

特有方法:

String readLine() 从BufferedReader自身的char数组中读取一行文本,遇到以下字符会认为完成一行的读取,换行('\n'),回车('\r')或者回车后直接换行,返回包含该行内容的字符串,如果达到流末尾,返回null

看下BufferedReader的read方法:read()访问的BufferedReader本身的char数组,当数组的内容被访问完毕时调用调用fill()方法重新填充char数组。

   private Reader in;public int read(char cbuf[], int off, int len) throws IOException {synchronized (lock) {ensureOpen();if ((off < 0) || (off > cbuf.length) || (len < 0) ||((off + len) > cbuf.length) || ((off + len) < 0)) {throw new IndexOutOfBoundsException();} else if (len == 0) {return 0;}int n = read1(cbuf, off, len);if (n <= 0) return n;while ((n < len) && in.ready()) {int n1 = read1(cbuf, off + n, len - n);if (n1 <= 0) break;n += n1;}return n; private int read1(char[] cbuf, int off, int len) throws IOException {if (nextChar >= nChars) {if (len >= cb.length && markedChar <= UNMARKED && !skipLF) {return in.read(cbuf, off, len);}fill();}if (nextChar >= nChars) return -1;if (skipLF) {skipLF = false;if (cb[nextChar] == '\n') {nextChar++;if (nextChar >= nChars)fill();if (nextChar >= nChars)return -1;}}int n = Math.min(len, nChars - nextChar);System.arraycopy(cb, nextChar, cbuf, off, n);nextChar += n;return n;}

BufferedReader示例:

源文件word.txt内容:
好啊
你好
天天
///
import java.io.*;public class BufferedReaderTest01 {public static void main(String[] args){try (BufferedReader br =new BufferedReader(new FileReader("word.txt"));){String s;//每次读取一行,读到末尾处为nullwhile ((s=br.readLine())!=null){System.out.println( s);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
out:
好啊
你好
天天

BufferedWriter

继承自Writer

构造方法:

 private static int defaultCharBufferSize = 8192;
//创建默认8192大小的char数组,用来缓存public BufferedWriter(Writer out) {this(out, defaultCharBufferSize);}
//根据指定大小创建char数组,用来缓存public BufferedWriter(Writer out, int sz) {super(out);if (sz <= 0)throw new IllegalArgumentException("Buffer size <= 0");this.out = out;cb = new char[sz];nChars = sz;nextChar = 0;}

工作工程: BufferedWriter先将数据写入自身的char数组,当调用write方法时,将内容写到自身的char数组,再调用参数Writer对象的write方法从char数组中读取内容写入到文件中

关闭BufferedWriter时,自动关闭作为参数的Writer对象

特有方法:

newLine()换行

write方法,可以写字符串和char数组,可以指定他们的起始位置和长度,看下write的源码:

先将内容保存到自身的char数组中,再访问自身char数组,再将内容写入到文件中

private Writer out;//构造方法中传入的Writer对象
private char cb[];
//调用flushBuffer方法来写
public void write(int c) throws IOException {synchronized (lock) {ensureOpen();if (nextChar >= nChars)flushBuffer();cb[nextChar++] = (char) c;}}
//调用out的write方法,out是创建BufferedWriter对象时,传进来的Writer对象
void flushBuffer() throws IOException {synchronized (lock) {ensureOpen();if (nextChar == 0)return;out.write(cb, 0, nextChar);nextChar = 0;}}

示例:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferedWriterTest01 {public static void main(String[] args){try (BufferedWriter bw=new BufferedWriter(new FileWriter("test\\test6.txt"));){bw.write("我们要加油");bw.newLine();//换行char [] charArr={'我','们','热','爱','祖','国'};bw.write(charArr,0,4);} catch (IOException e) {e.printStackTrace();}}
}
out:
test6.txt的内容为:
我们要加油
我们热爱

字符缓冲流复制文本文件:

import java.io.*;public class FileCopy02 {public static void main(String[] args){try (BufferedReader br=new BufferedReader(new FileReader("word1.txt"));BufferedWriter bw=new BufferedWriter(new FileWriter("test\\test7.txt"));){String s;//通过每次读取一行,提高效率while((s=br.readLine())!=null){bw.write(s);bw.newLine();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
out:
源文件word1.txt内容:
好吗
天天
目标文件test7.txt内容:
好吗
天天

画个示意图:

这篇关于java 字符缓冲流BufferedReader和BufferedWriter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/552489

相关文章

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化