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实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.