Java 日看一类(5)之IO包中的BufferedWriter类

Java之IO流超级全的总结 File类 InputStream OutputStream Reader Writer 一、File类 1、File类的理解 1)File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹); 2)File类声明在Java.io包下; 3)File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法; 4)后续File类的对象会作为参数传递到流的构造器中,指明读取或写入的“终点”; 2、File类的实例化 2.1常用构造器 ①File(String filePath) //filePath:文件的路径 File file1 = new File("hello.txt" 阅读详情

引入包和继承关系:

无引入包

继承自Writer类(类似于BufferReader)





代码注释:

/**
 * Writes text to a character-output stream, buffering characters so as to
 * provide for the efficient writing of single characters, arrays, and strings.
 *
 * <p> The buffer size may be specified, or the default size may be accepted.
 * The default is large enough for most purposes.
 *
 * <p> A newLine() method is provided, which uses the platform's own notion of
 * line separator as defined by the system property <tt>line.separator</tt>.
 * Not all platforms use the newline character ('\n') to terminate lines.
 * Calling this method to terminate each output line is therefore preferred to
 * writing a newline character directly.
 *
 * <p> In general, a Writer sends its output immediately to the underlying
 * character or byte stream.  Unless prompt output is required, it is advisable
 * to wrap a BufferedWriter around any Writer whose write() operations may be
 * costly, such as FileWriters and OutputStreamWriters.  For example,
 *
 * <pre>
 * PrintWriter out
 *   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
 * </pre>
 *
 * will buffer the PrintWriter's output to the file.  Without buffering, each
 * invocation of a print() method would cause characters to be converted into
 * bytes that would then be written immediately to the file, which can be very
 * inefficient.
 *
 * @see PrintWriter
 * @see FileWriter
 * @see OutputStreamWriter
 * @see java.nio.file.Files#newBufferedWriter
 *
 * @author      Mark Reinhold
 * @since       JDK1.1
 */

大意如下:

向字符输出流写入文本时,对字符进行缓冲处理是一种高效的处理方式,尤其是逐个的字符写入,数组结构写入或者字符串结构写入

缓冲区的大小可被设定,默认大小足以满足一般情况的需求

提供了newLine()方法,提供了基于不同平台的行分割方法,因为不是所有平台都是用'\n'作为换行符,所以使用newLine方法是首选。

一般情况下,Writer类总是立即将数据输出到底层的字符流或比特流中。除非程序需要即刻输出,否则使用BufferedWriter封装时最好的选择。(对于write()方法开销较大的Writer类十分必要)

例如:

  PrintWriter out  = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

对PrintWriter类进行了缓冲。如果没有缓冲,任意一个对print方法的调用将会使字符转化为byte并且立刻写入到文件中,这是非常低效率的。




BufferedWriter含有五个成员变量:

被其封装的Writer类:

private Writer out;

缓冲区:

private char cb[];

缓冲区最大长度(这个和前几个不一样)和当前读取位置指针:

private int nChars, nextChar;

默认缓冲区长度:

private static int defaultCharBufferSize = 8192;

行分割符字符串

private String lineSeparator;



含有十一个方法:

构造函数:(默认大小缓冲区)

public BufferedWriter(Writer out) {
    this(out, defaultCharBufferSize);
}

构造函数:(自定义大小)

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;

    lineSeparator = java.security.AccessController.doPrivileged(//对操作权限不进行检查
        new sun.security.action.GetPropertyAction("line.separator"));//该类实现一个接口,对传入的字符串调用System.getProperty(),获取当前系统行分割符(line.separator为该方法的保留限定字)
}

检测输出流状态:

private void ensureOpen() throws IOException {
    if (out == null)
        throw new IOException("Stream closed");
}

清空缓冲区(将缓冲区内容全部写入输出流):

void flushBuffer() throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar == 0)
            return;
        out.write(cb, 0, nextChar);
        nextChar = 0;
    }
}
向缓冲区中写入字符:
public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)//缓冲区满了就清空缓冲区
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

两数求最小值:(我也不知道源码里为啥有个这……和前面几个风格完全不搭)

private int min(int a, int b) {
    if (a < b) return a;
    return b;
}

向缓冲区中写入数组:

public void write(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;
        }

        if (len >= nChars) {//写入长度大于缓冲区长度(前几个里面nChars都是标记缓冲区当前有效长度的,这个突然变成了最大长度……应该是换人写了)
            /* If the request length exceeds the size of the output buffer,
               flush the buffer and then write the data directly.  In this
               way buffered streams will cascade harmlessly. */
            flushBuffer();
            out.write(cbuf, off, len);
            return;
        }

        int b = off, t = off + len;
        while (b < t) {//循环写入
            int d = min(nChars - nextChar, t - b);
            System.arraycopy(cbuf, b, cb, nextChar, d);
            b += d;
            nextChar += d;
            if (nextChar >= nChars)
                flushBuffer();
        }
    }
}

写入字符串:

public void write(String s, int off, int len) throws IOException {
    synchronized (lock) {
        ensureOpen();

        int b = off, t = off + len;
        while (b < t) {//循环写入
            int d = min(nChars - nextChar, t - b);
            s.getChars(b, b + d, cb, nextChar);//字符串转字符
            b += d;
            nextChar += d;
            if (nextChar >= nChars)
                flushBuffer();
        }
    }
}

换行(在数据中插入换行符):

public void newLine() throws IOException {
    write(lineSeparator);
}

将数据全部输出:

public void flush() throws IOException {
    synchronized (lock) {
        flushBuffer();
        out.flush();
    }
}

关闭流:

public void close() throws IOException {
    synchronized (lock) {
        if (out == null) {
            return;
        }
        try (Writer w = out) {
            flushBuffer();
        } finally {
            out = null;
            cb = null;
        }
    }
}




和前几个做的Buffered类的代码命名习惯有显著差别,不过整体思路没有大变化

50、Java IO 包及相关类的详细解析 本文详细解析了Java IO包的核心类和接口,包括字节流和字符流的分类与使用,重点介绍了缓冲流、非流类如File和RandomAccessFile的用途,并提供了代码示例帮助理解。此外,还涵盖了Java 5.0对I/O流的改进、异常处理机制及性能优化建议,旨在帮助开发者更好地掌握Java IO包在实际项目中的应用。 阅读详情

相关推荐

Clang Static Analyzer 使用教程:本地 + CMake + GitHub Actions 自动静态分析实战

本文介绍了ClangStaticAnalyzer静态代码分析工具的使用方法。该工具基于Clang/LLVM,可检测C/C++代码中的内存泄漏、空指针等常见错误。主要内容包括:安装指南(Ubuntu/macOS/Windows)、命令行使用方法、CMake项目集成方案、GitHub Actions自动化分析配置,以及HTML报告生成与查看。文章还提供了官方资源链接,帮助开发者系统掌握从本地调试到持续集成的完整静态分析工作流,提升代码质量保障能力。适用于需要在开发过程中实施静态分析的C/C++项目。

u014358031的博客 2159

java循环写入文件_JAVA读写文件中的循环问题

代码如下,想利用Java中一个读写文件的类,来实现对文件中每一行进行操作创建map,以为利用while循环可以,没想到不能循环,得到的结果只有一个,并不能实现处理每一行,这是为什么呢?求大神指点package testimport java.awt.List;import java.io.BufferedReader;import java.io.BufferedWriter;import jav...

weixin_39805195的博客 1645

别再死磕NFP了!用Python+遗传算法搞定异形件自动排版(附完整代码)

本文介绍了如何利用Python和遗传算法实现异形件智能排版,解决传统NFP方法计算复杂的问题。通过Shapely库处理几何运算和DEAP库搭建遗传算法框架,结合模拟退火策略避免局部最优,显著提升材料利用率。附完整代码和优化技巧,适用于服装裁剪、金属加工等行业。

weixin_26965807的博客 236

BufferedWriter 使用

BufferedWriter是输出的时候有一个缓冲区,而FileWriter是直接跟输出介质发生关系的主要还是有个缓冲区吧,具体缓冲区有什么作用可以参考一下API 相同点:都是使用字符流写文件。不同点:前者采用缓冲区,可以预读一些准备写入的数据,增加写入文件时的效率,    而后者则没有这个功能。具体的在BufferedWriter的API DOC中有说明。再DOS中,"/r/n" 连在一起才是换

Anthony88的专栏 1543

【深度学习-番外1】Win10系统搭建VSCode+Anaconda+Pytorch+CUDA深度学习环境和框架全过程

本文将介绍在Windows 10系统下搭建深度学习环境的完整过程,包括安装Anaconda、CUDA、NVIDIA显卡驱动以及Pytorch框架。后续本专栏的Python语言下的深度学习环境都以本篇搭建的为准。

fengzhuqiaoqiu的博客 4003

三菱PLC通信库大比拼:手把手教你用C#实现最高效的McProtocol数据读写

本文深入比较了三菱PLC通信库的性能,重点介绍了如何使用C#高效实现McProtocol数据读写。通过实测数据对比HslCommunication、McProtocol-next和自定义方案的优劣,提供优化技巧和代码示例,帮助开发者在工业自动化场景中提升通信效率。

m0n1o2p的博客 259

从源码剖析IO流(三)缓存流--转载请注明出处

一、BufferedInputStream 关于BufferedInputStream,首先我们要看一下,官方给予的对于BufferedInputStream这个类的备注: /** * A &lt;code&gt;BufferedInputStream&lt;/code&gt; adds * functionality to another input stream-namely, *...

qq_35427785的博客 321

【卫星语音通信】神经网络语音编解码算法:AudioDec

最新研究表明,通过深度学习模型对语音信号进行智能压缩与重建,可在12 kbps码率下实现48 kHz采样率的高保真语音还原,其主观音质评分(MOS)可达3.9分(满分4.27分),远超传统参数编码技术。这意味着未来卫星电话的通话质量有望达到CD级水准,而蜂窝网络的语音业务带宽需求可降低60%以上,为蜂窝和卫星网络中的大规模物联网语音交互铺平道路。它的诞生为神经音频编解码技术带来了一次重要升级,有助于让未来实时语音交互更流畅、更清晰,也让我们进一步体验到人工智能与音频信号处理结合所带来的创新可能性。

u011376987的博客 1473

一文详解JAVA的字节流,BufferedReader和BufferedWriter

Java的字节流是一种用于处理二进制数据的输入输出流。在Java中,字节流以字节为单位进行读取和写入操作。字节流分为输入字节流和输出字节流。

2301_77899321的博客 2014

再见 n8n?Google Opal 实测:一句话生成 APP,这才是 AI 的正确打开方式!

Google Opal深度评测:这款自然语言生成工作流的AI工具,通过三个实战案例(科技早报生成器、冰箱食谱助手、爆款文案转译机)展示了其零代码开发的强大能力。它凭借Gemini 3.0 Pro和Google生态的无缝集成,将自动化门槛降至新低,预示着一个“意图驱动开发”的新时代。

莫潇羽的个人博客 849

《派出你的AI同事:WorkBuddy案例实战》067:按行业分类的案例索引

按行业分类的案例索引 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 102

BufferedOutputStream源码分析与flush方法

概述 该类是缓冲输出流的实现。通过设置这样的一个输出流,可以避免每写入一个字节都产生一次底层系统调用。 write(byte b[], int off, int len)方法 从目标字节数组b的给定下标位置offset开始,写入len个字节到缓冲输出流中。 该方法实现如下: 路径一:如果len &gt;= buf.length,则将缓冲区的内容全部写入到底层输出流,清空缓冲区。然后再将目...

lzf的博客 2715

【我的Android进阶之旅】解决android应用使用android:persistent属性带来的系统Launcher应用必须重启设备才生效的问题,大幅度提升开发效率

一、问题描述 我们在开发系统级别应用,比如Launcher桌面的时候,会发现有个问题:每次Launcher修改完代码,重新编译之后,安装到android设备上之后,必须重启才会生效。否则就是使用了之前的Launcher版本的内容。而每次重启设备得一分钟左右,太慢了,太影响效率了! 1.1 痛点 每次更新完代码,重新安装之后,必须重启设备才会生效。效率太TM低了! 二、分析问题 经过一轮代码排查,最终发现是因为src\main\AndroidManifest.xml文件中,定义application使用了an

字节卷动 1715

Java的IO总结

非流式文件类--File类 从定义看,File类是Object的直接子类,同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。 File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。File类保存文件或目录的各种元数据信息,包括文件名、...

少说,多做。 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中IO字符流、File类

目录 一、概述 1、字符流分类: 2、FileWriter使用: 3、追加写入: 4、实现换行 5、五种writer方法的重载 6、FileReader的使用 7、BufferedXxx和FileXxx的区别: 8、BufferedWriter额外方法: 9、BufferedReader额外方法: 10、代码实例 二、File 类 1、File类的概述和作用 2、Fil...

ONESTARの博客 4540

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java BufferedWriter newLine()方法与示例

BufferedWriter类newLine()方法 (BufferedWriter Class newLine() method) newLine() method is available in java.io package. newLine()方法在java.io包中可用。 newLine() method” is responsible for the new line to the ...

cumtv80668的专栏 2759

java IO流FileReader、FileWriter、BufferedReader、BufferedWriter的使用

文章目录1. 概述2. FileWriter类的使用3. FileWriter写数据的5个方法4. FileReader读数据5. 利用FileReader和FileWriter复制文件6. FileReader一次读取一个字符数组7. 缓冲流 BufferedWriter、BufferedRead 的基本使用8. 高效地复制文本文件9. 缓冲流的特殊功能 1. 概述 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流

超级大洋葱的博客 1441

缓冲字符流BufferedWriter、BufferedReader以及IO中的装饰者模式

Java IO中的缓冲字符流BufferedWriter、BufferedReader、LineNumberReader的使用方式,以及Java IO中的装饰者模式。

终生学习践行者 1600

Java IO流最全详解

一个程序总是离不开数据的输入(Input)输出(IO),而Java IO流就是用于程序从外部读取数据,以及向外部写出数据的java处理包,本文详细讲解Java IO包中常用的IO流,通过本文的知识,可以使得你在开发中随心所欲的高效使用IO流。......

Mekeater的博客 5670

Java IO包

Java IO包 Java读写文件,只能以(数据)流的形式进行读写(Java和文件是两套平行的系统。由于文件可能很大,Java不能一口气将文件都加载进内存,只能以流的方式分批读取) java.io包中 –节点类:直接对文件进行读写 –包装类 转化类:字节/字符/数据类型的转化类 (eg:一个int—>4个字节 —>int) 装饰类:装饰节点类 Bufferd 字节:byte,8bit,最基础的存储单位 字符:a,10000(5个字符),我(一个字符) 数据类型:3,3.35,ab

weixin_44227389的博客 641

java BufferedReader类、BufferedWriter类

读取一个字符char并以整数int形式返回。整数int对应的字符char在ascall码表上的值。创建一个使用默认大小的输入缓冲区的缓冲字符(char,一个字符为两个字节)输入流。创建一个使用指定大小的输入缓冲区的缓冲字符输入流。当在控制台输入abced时,输出的结果为c。关闭当前的缓冲字符输入流并释放相关的资源。跳过指定的字符数,返回实际跳过的字符数。从标准输入中读取一个字符串。..................

weixin_49346755的博客 788

Java.io.BufferedWriter类

Java.io.BufferedWriter类将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。以下是有关的BufferedWriter要点: 缓冲区的大小可以被指定或默认的大小也可使用。 Writer 发送其输出到底层字符或字节流。 更多教程请访问http://www.manongzj.com 类的声明 以下是Java.io.BufferedWriter类的声明: public class BufferedWriter extend..

wuxiaopengnihao1的博客 351

Java——IO流超详细总结

该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。 在初学Java时,IO流是我遇到的一个很头疼的东西,Java IO 体系看起来类很多,感觉很复杂,但其实是 IO 涉及的因素太多了。在设计 IO 相关的类时,编写者也不是从同一个方面考虑的,所以会给人一种很乱的感觉,并且还有设计模式的使用,更加难以使用这些 IO 类,所以特地对 Java 的 IO 做一个总结。 1|0

ywb201314的专栏 6630

java基础IO流以及缓冲流BufferedReader,BufferedWriter

java基础IO流以及BufferedReader,BufferedWriter

涛的博客 911

对java IO BufferedWriter 使用的演示

import java.io.*; /*  对java IO BufferedWriter 使用的演示 */ class BufferedDemo{  static BufferedWriter bw;  static FileWriter fw;  public static void main(String[] args){   try{    fw = new FileWr

limao314的专栏 467

java IO 之BufferedReader和BufferedWriter

1packagecom.io.test;23importjava.io.BufferedReader;4importjava.io.BufferedWriter;5importjava.io.FileNotFoundException;6importjava.io.FileReader;7importjava.io.FileWriter;8import...

weixin_30518397的博客 234
上一篇: Java 日看一类(4)之IO包中的BufferedReader类
下一篇: Java 日看一类(6)之IO包中的ByteArrayInputStream类
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值