BufferedReader和BufferedWriter

概念

BufferedReader:是一个从字符输入流中读取文本的类。它提供了一个缓冲区,可以一次性读取大量数据,从而减少实际读取操作的次数,提高读取效率。

BufferedWriter:是一个将文本写入字符输出流的类。它提供了一个缓冲区,可以一次性写入大量数据,从而减少实际写入操作的次数,提高写入效率。

主要构造方法

BufferedReader

BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流。

BufferedReader(Reader in, int sz): 创建一个使用指定大小输入缓冲区的缓冲字符输入流。

BufferedWriter

BufferedWriter(Writer out): 创建一个使用默认大小输出缓冲区的缓冲字符输出流。

BufferedWriter(Writer out, int sz): 创建一个使用指定大小输出缓冲区的缓冲字符输出流。

public static void main(String[] args) throws IOException {// BufferedWriter(Writer out): 创建一个使用默认大小输出缓冲区的缓冲字符输出流。BufferedReader br1 = new BufferedReader(new FileReader("aaa.txt"));//BufferedReader(Reader in, int sz): 创建一个使用指定大小输入缓冲区的缓冲字符输入流。BufferedReader br2 = new BufferedReader(new FileReader("aaa.txt"),8000);//BufferedWriter(Writer out): 创建一个使用默认大小输出缓冲区的缓冲字符输出流。BufferedWriter bw1 = new BufferedWriter(new FileWriter("bbb.txt"));//BufferedWriter(Writer out, int sz): 创建一个使用指定大小输出缓冲区的缓冲字符输出流。BufferedWriter bw2 = new BufferedWriter(new FileWriter("bbb.txt"),8000);}
缓冲区大小

BufferedReader和BufferedWriter的内部缓冲区大小可以通过构造函数来设置。如果不显式设置,默认大小通常是8192字节。

主要方法

BufferedReader
  • read(): 读取单个字符并返回。如果已到达流的末尾,则返回-1。
  • read(char[] cbuf, int off, int len): 将字符读入数组的一部分。返回读取的字符数,或者在流的末尾返回-1。
  • readLine(): 读取一个文本行,返回一个包含行内容的字符串,不包含任何行终止符。如果已到达流的末尾,则返回null。
  • ready(): 判断输入流是否准备好进行读取,返回布尔值。
  • close(): 关闭流并释放与之关联的所有资源。
public static void main(String[] args) {//read()try (BufferedReader br = new BufferedReader(new FileReader("/home/utarn/桌面/aaa.txt"))) {int c;//read()//读取单个字符并返回其整数表示,如果已到达流的末尾,则返回-1。while ((c = br.read())!=-1){System.out.print((char)c);}} catch (IOException e) {e.printStackTrace();}//read(char[] cbuf, int off, int len)try (BufferedReader br = new BufferedReader(new FileReader("/home/utarn/桌面/aaa.txt"))) {char[] buffer = new char[2];int numRead;//read(char[] cbuf, int off, int len)//将字符读入数组的一部分,返回读取的字符数,或者在流的末尾返回-1。if ((numRead = br.read(buffer, 0, buffer.length)) != -1) {System.out.print(new String(buffer, 0, numRead));}} catch (IOException e) {e.printStackTrace();}System.out.println();//readLine()try (BufferedReader br = new BufferedReader(new FileReader("/home/utarn/桌面/aaa.txt"))) {String line;//readLine()//读取一个文本行,返回一个包含行内容的字符串,不包含任何行终止符。如果已到达流的末尾,则返回null。while ((line = br.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}//ready()//判断输入流是否准备好进行读取,返回布尔值。try (BufferedReader br = new BufferedReader(new FileReader("/home/utarn/桌面/aaa.txt"))) {while (br.ready()) {System.out.println(br.readLine());} } catch (IOException e) {e.printStackTrace();}}
BufferedWriter
  • write(int c): 写入单个字符。
  • write(char[] cbuf, int off, int len): 写入字符数组的一部分。
  • write(String s, int off, int len): 写入字符串的一部分。
  • newLine(): 写入一个行分隔符。
  • flush(): 刷新缓冲区,将缓冲区内容写入输出流。
  • close(): 关闭流,并刷新任何缓冲的输出。
public static void main(String[] args) {//write(int c)//写入单个字符。try (BufferedWriter bw = new BufferedWriter(new FileWriter("/home/utarn/桌面/bbb.txt"))) {bw.write('H');bw.write('e');bw.write('l');bw.write('l');bw.write('o');} catch (IOException e) {e.printStackTrace();}//write(char[] cbuf, int off, int len)//写入字符数组的一部分。try (BufferedWriter bw = new BufferedWriter(new FileWriter("/home/utarn/桌面/bbb.txt"))) {char[] buffer = "Hello, World!".toCharArray();bw.write(buffer, 0, buffer.length);} catch (IOException e) {e.printStackTrace();}//write(String s, int off, int len)//写入字符串的一部分。try (BufferedWriter bw = new BufferedWriter(new FileWriter("/home/utarn/桌面/bbb.txt"))) {String str = "Hello, World! write(String s, int off, int len)";bw.write(str, 0, str.length());} catch (IOException e) {e.printStackTrace();}//newLine() 写入一个行分隔符。//flush() 刷新缓冲区,将缓冲区内容写入输出流。try (BufferedWriter bw = new BufferedWriter(new FileWriter("/home/utarn/桌面/bbb.txt"))) {bw.write("Hello, World!");bw.newLine();     // 空一行bw.write("newLine()");bw.flush();} catch (IOException e) {e.printStackTrace();}}

try-with-resources

在Java中,try-with-resources语句是用于自动关闭实现了java.lang.AutoCloseable接口(包括实现了java.io.Closeable接口)的资源(如文件、流、网络连接等)的结构化方式。它可以确保在使用完资源后自动关闭它们,避免资源泄漏。

示例代码解释

我们可以使用try-with-resources语句来自动管理资源,确保它们在使用完毕后正确关闭,即使在发生异常的情况下。

下面是一个使用try-with-resources语句的例子,展示如何使用BufferedWriter写入文件,并确保资源在使用后自动关闭。

package org.example;import java.io.*;
public class Buffer {public static void main(String[] args) {try (BufferedWriter bw = new BufferedWriter(new FileWriter("/home/utarn/桌面/bbb.txt"))) {bw.write("Hello, World!");bw.newLine();     // 空一行bw.write("newLine()");bw.flush();} catch (IOException e) {e.printStackTrace();}}
}
关键点
  1. 自动关闭资源:在try块中声明的资源(在此例中为BufferedWriter)在try块结束时会自动关闭,无需显式调用close()方法。这是在try块退出时,无论是正常退出还是由于异常退出,都会执行的。

  2. 减少冗余代码:try-with-resources语句减少了手动管理资源的冗余代码,使代码更简洁和易读。

  3. 异常处理:如果在使用资源的过程中抛出异常,try-with-resources语句仍会确保资源被关闭。这是通过自动调用资源的close()方法来实现的。

flush()方法的作用

虽然try-with-resources会在关闭BufferedWriter时自动调用flush(),但有时你可能希望在某些时刻强制将缓冲区中的数据写入文件。示例:

package org.example;import java.io.*;
public class Buffer {public static void main(String[] args) {try (BufferedWriter bw = new BufferedWriter(new FileWriter("/home/utarn/桌面/bbb.txt"))) {bw.write("Hello, World!");bw.newLine();     // 空一行bw.write("newLine()");bw.flush();} catch (IOException e) {e.printStackTrace();}}
}

在上述示例中,flush()方法会强制将缓冲区中的内容立即写入文件,这在需要确保数据在某个特定时刻被写入时是有用的,例如在实时日志记录或系统状态持久化时。

总结
  1. try-with-resources语句:简化资源管理,确保资源在使用后自动关闭。
  2. 自动调用close():try-with-resources会自动调用资源的close()方法,即使发生异常。
  3. 显式调用flush():在需要立即写入数据时,可以显式调用flush()方法,尽管在资源关闭时会自动刷新缓冲区。

注意事项

  1. 缓冲区大小:默认缓冲区大小一般是8KB,具体大小可以根据需求调整。如果进行大量小数据的读写操作,适当增大缓冲区大小可以提高性能。
  2. 资源管理:在使用BufferedReader和BufferedWriter时,务必在操作完成后关闭流,以释放系统资源。使用try-with-resources语句可以自动关闭流。
  3. 线程安全:BufferedReader和BufferedWriter不是线程安全的,如果多个线程同时访问同一个流,可能会导致数据不一致。可以使用适当的同步机制来保证线程安全。
  4. 高效读写:为了高效地读取和写入数据,缓冲机制是关键。通过减少实际I/O操作的次数,BufferedReader和BufferedWriter提供了显著的性能提升,特别是在处理大文件或频繁读写的场景下。

转载自开思通智网:https://www.opensnn.com/os/article/10000859

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB】语法

MATLAB 基本语法(%{和%}) 赋值 函数名值&#xff1b;for for i1:10循环语句 end//while x0; sum0; while x<100sumsumx;x; end//if if x > 1f x^2 1; elsef 2 * x endswitch onum input(请输入一个数); switch num case -1 //注意case后面没有冒号disp(I am…

【Linux】Linux简介

Linux是一种自由和开放源码的类Unix操作系统&#xff0c;其核心由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布。 起源与发展&#xff1a; Linux最初是作为Unix操作系统的一种克隆系统而诞生的&#xff0c;旨在提供一个免费…

[杂项:书籍]《生命的品质》

第八辑&#xff1a; 书 * 对于忙&#xff0c;我始终有一种警惕。我确立了两个界限&#xff0c;第一要么忙得愉快&#xff0c;只为自己真正喜欢的事忙&#xff0c;第二要忙得有分寸&#xff0c;做多么喜欢的事也不让自己忙昏了头。 我 * 对于第一点&#xff0c;我做不到&#…

PostgreSQL17优化器改进(5)GROUP BY优化

PostgreSQL17优化器改进(5)GROUP BY优化 我们知道GROUP BY聚集有两种常见实现方式&#xff0c;一种是基于哈希表&#xff0c;我们称为哈希聚集&#xff08;Hash agg&#xff09;&#xff1b;另一种则要求先对元组进行排序&#xff0c;我们称为分组聚集&#xff08;Group Agg&a…

昇思25天学习打卡营第1天|基本介绍及快速入门

1.第一天学习总体复盘 1&#xff09;成功注册昇思大模型平台&#xff0c;并成功申请算力&#xff1b; 2)在jupyter环境下学习初学入门/初学教程的内容&#xff1b; 在基本介绍部分&#xff0c;快速撸了一边内容&#xff0c;有了一个基本的了解&#xff08;没理解到位的计划采用…

win11使用qemu安装arm64 openEuler虚拟机 并虚拟机中在安装docker

1、安装openEuler教程&#xff1a;Windows11 上使用 QEMU 创建 aarch64&#xff08;ARM64&#xff09;虚拟机_tap-windows-9.24.7-i601-win10.exe-CSDN博客 2、虚拟机安装docker&#xff1a;Windows11 上使用 QEMU 创建 aarch64&#xff08;ARM64&#xff09;虚拟机_tap-windo…

【尝鲜】SpringCloudAlibaba AI 配置使用教程

1、环境配置 maven依赖pom.xml 注意配置远程仓库&#xff0c;原因见&#xff1a;Unresolved dependency: ‘org.springframework.ai:spring-ai-core:jar:0.8.1’ <dependencies><!--Base--><dependency><groupId>org.springframework.boot</group…

用qq邮箱发送邮件验证码java

添加依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency>配置邮箱 实现代码 package com.example.demo.service; import org.springframework.st…

芜湖!恒驰大数据迁移案例荣幸亮相“东数西算”芜湖集群创新大会暨华为云华东(芜湖)数据中心全球开服活动

6月13日至14日&#xff0c;“东数西算”芜湖集群创新大会暨华为云华东&#xff08;芜湖&#xff09;数据中心全球开服活动在安徽芜湖隆重举办&#xff0c;标志着“东数西算”芜湖集群正式上线、华为云全国存算网的枢纽节点布局全面完成。 本次活动由华为技术有限公司主办、芜湖…

软磁盘阵列与硬磁盘阵列介绍

前言 软磁盘阵列&#xff08;软RAID&#xff09;与硬磁盘阵列&#xff08;硬RAID&#xff09;在多个方面存在显著的差异。以下是关于两者对比的详细分析&#xff1a; 一、定义与实现方式 软RAID&#xff1a;通过软件程序并由计算机的CPU提供运行能力来实现RAID功能。阵列的配…

金属配件加工厂设备远程监控

随着科技的飞速发展&#xff0c;智能制造已成为制造业转型升级的重要方向。在金属配件加工领域&#xff0c;设备的稳定运行和高效管理对于提升产品质量、降低生产成本至关重要。HiWoo Cloud平台凭借其强大的远程监控功能&#xff0c;为金属配件加工厂提供了全新的解决方案&…

Android SurfaceFlinger——服务启动流程(二)

SurfaceFlinger 是 Android 系统中的一个核心服务&#xff0c;负责管理图形缓冲区的合成和屏幕显示&#xff0c;是 Android 图形系统的关键组件。 一、启动流程 SurfaceFlinger 作为一个系统服务&#xff0c;在 Android 启动早期由 init 进程通过 servicemanager 启动。它是作…

【黑马TS】学习资料Day4

五、在 React 中使用 TypeScript 现在&#xff0c;我们已经掌握了 TS 中基础类型、高级类型的使用了。但是&#xff0c;如果要在前端项目开发中使用 TS&#xff0c;还需要掌握 React、Vue、Angular 等这些库或框架中提供的 API 的类型&#xff0c;以及在 TS 中是如何使用的。 …

作为一名程序员,最大的成就感来自哪里?

说在前面 &#x1f388;作为一名程序员&#xff0c;我们的生活充满了挑战与创造。在成千上万行代码的背后&#xff0c;我们的成就感来源于何处&#xff1f;是解决问题的瞬间&#xff0c;是产品发布的一刻&#xff0c;还是用户的一声赞叹&#xff1f; 解决问题的瞬间 每当我们调…

Python基础学习文档

一、Python入门 1.Python简介&#xff1a; Python是一种高级编程语言&#xff0c;用于多种应用&#xff0c;包括网站开发、数据科学、人工智能等。 Python具有语法简洁、易读性强、功能强大等特点。 2.安装Python ①访问Python官网&#xff08;https://www.python.org/&am…

AI写作平台:提升文档撰写效率的神器

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

驱动层透明加密技术是什么?

驱动层透明加密技术的应用场景主要集中在确保数据在存储、传输和使用过程中的安全性&#xff0c;特别是在需要严格控制文件访问和防止数据泄露的场合。以下是几个具体的应用场景&#xff0c;结合参考文章中的相关信息进行归纳&#xff1a; www.weaem.com 内部文件流通&#xf…

【索引】数据库索引之顺序索引概述

目录 1、索引的基本概念 2、顺序索引 3、稠密索引和稀疏索引 3.1 什么是稠密索引&#xff1f; 3.2 什么是稀疏索引&#xff1f; 4、索引的更新 4.1 索引的插入操作 4.1 索引的删除操作 5、辅助索引 1、索引的基本概念 数据库中的索引与图书馆中书的索引作用相同&#xf…

Spire.PDF for .NET【文档操作】演示:如何删除 PDF 中的图层

借助Spire.PDF&#xff0c;我们可以在新建或现有pdf文档的任意页面中添加线条、图像、字符串、椭圆、矩形、饼图等多种图层。同时&#xff0c;它还支持我们从pdf文档中删除特定图层。 Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PD…

【Python/Pytorch 】-- 滑动窗口算法

文章目录 文章目录 00 写在前面01 基于Python版本的滑动窗口代码02 算法效果 00 写在前面 写这个算法原因是&#xff1a;训练了一个时序网络&#xff0c;该网络模型的时序维度为32&#xff0c;而测试数据的时序维度为90。因此需要采用滑动窗口的方法&#xff0c;生成一系列32…