系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader

目录:系统学习 Java IO---- 目录,概览

BufferedReader

BufferedReader 类构造器接收一个 Reader 对象,为 Reader 实例提供缓冲。 缓冲可以加快 IO 的速度。 BufferedReader 不是一次从网络或磁盘读取一个字符,而是一次读取一个更大的块。 这通常要快得多,特别是对于磁盘访问和更大的数据量。

类似于 BufferedInputStream ,主要区别在于 BufferedReader 读取字符(文本),而 BufferedInputStream 读取原始字节。

除了向Reader实例添加缓冲外,BufferedReader 的行为与 Reader 非常相似。 BufferedReader 有一个额外的方法,即 readLine() 方法。 如果您需要一次读取一行输入,则此方法很方便。

String line = bufferedReader.readLine();

BufferedWriter

BufferedWriter 类构造器接收一个 Writer 对象,为 Writer 实例提供缓冲。 缓冲可以加快 IO 的速度。 BufferedWriter 不是一次写一个字符到网络或磁盘,而是一次写一个更大的块。 这通常要快得多,特别是对于磁盘访问和更大的数据量。

可以包装 FileReader 的 BufferedReader 。 BufferedReader 将从 FileReader 读取一个字符块(通常为 char 数组)。 因此,从 read() 返回的每个字符都从此内部数组返回。 当数组被读完时,BufferedReader 将一个新的数据块读入数组等。

可以设置 BufferedReader/BufferedWriter 在内部使用的缓冲区大小。默认大小是 8192 的字符数组。

一个简单的使用实例如下:

File file = new File("D:\\test\\1.txt");
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write("string from BufferedWriter");
writer.close();

int bufferSize = 8 * 1024; // 可选的缓冲字符数组大小
BufferedReader reader = new BufferedReader(new FileReader(file), bufferSize);
int data = reader.read();
while (data != -1) {
    System.out.print((char) data); // string from BufferedWriter
    data = reader.read();
}
reader.close();

PushbackReader

PushbackReader 类旨在从 Reader 解析数据时使用,它可以包装一个 Reader 对象。 PushbackReader 允许将读取的字符推回到 Reader 中下次调用 read() 时,将再次读取这些字符。通俗来讲,PushbackReader 提供了一种可能,让我们能读取流的部分内容而不破坏流。

PushbackReader 的工作方式与 PushbackInputStream 非常相似,只是 PushbackReader 适用于字符,而 PushbackInputStream 适用于字节。所以请参考前面的文章,不再赘述了。下面提供一个简单的例子:

PushbackReader pushbackReader = new PushbackReader(new FileReader("c:\\data\\input.txt"));
int data = pushbackReader.read();
pushbackReader.unread(data);
设置 PushbackReader 的后推限制

有一个构造函数 public PushbackReader(Reader in, int size) 可以设置 PushbackReader 的后推限制,如果不设置这个值,那默认为 1 ,这个值很重要,表示了最多能往回推多少个字符,如果读取了 10 个字符,但是后退限制为 1 的话,那总共只能推回 1 个字符,剩下的 9 个字符没办法推回去,流就被破坏了。

一个使用示例如下:

public class PushbackReaderExample {
    public static void main(String[] args) throws IOException {
        int limit = 2; // 可选,最多只能推回 2 个字符,默认值是 1
        File file = new File("D:\\test\\1.txt"); // 文件内容是 123456789
        PushbackReader reader = new PushbackReader(new FileReader(file), limit);
        char[] bytes = new char[9]; // 读取 9 个字符;
        reader.read(bytes);
        System.out.println(bytes); // 123456789

        reader.unread(97); // 推回操作都是将内容复制到推回缓冲区的前面
        reader.unread(97); // 97 是字符 ‘a‘ 的 int 值,推回 2 个 ‘a‘
        // reader.unread(97); // 会失败并抛出异常,因为最多只能推回2个字符
        reader.read(bytes);
        System.out.println(bytes); // aa3456789
        reader.close();
    }
}
close()

当完成从 PushbackReader 读取字符后,记得关闭它。 关闭 PushbackReade还将关闭 PushbackReader 正在读取的 Reader 实例。

FilterReader/FilterWriter

FilterReader 是用于实现自己的过滤阅读器的基类。 基本上它只是覆盖了 Reader 中的所有方法。

与 FilterInputStream 一样,我认为这个类没有明智的目的。 我无法看到这个类实际上添加或更改了 Reader 中的任何行为,只是它在构造函数中需要一个 Reader 。 如果想选择扩展此类,则可以直接扩展 Reader 类,并避免层次结构中的额外类。FilterWriter 同样。

原文地址:https://www.cnblogs.com/czwbig/p/10013922.html

时间: 2024-10-11 10:50:01

系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader的相关文章

系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类

目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取字符的行号.行号从 0 开始.每当 LineNumberReader 在包装的 Reader 返回的字符中遇到行终止符时,行号递增. 可以通过调用 getLineNumber() 方法获取当前行号,也可以通过调用 setLineNumber() 方法设置当前行号. 注意设置的行号不会改变实际的文件指

系统学习 Java IO (十六)----这么多类,应该用哪个?

目录:系统学习 Java IO---- 目录,概览 ### Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原因是,所有这些子类都在解决各种不同的目的. 所涉及的目的总结如下: 网络访问 内部缓冲区访问 线程间通信(管道) 缓冲 过滤 解析 阅读和写作文本(Reader/Writer) 读写原始数据(long,int等) 读和写对象 Java IO类概述表 在讨论了 Java IO 类所针对的源,目

系统学习 Java IO (三)----FileInputStream/FileOutputStream & RandomAccessFile

目录:系统学习 Java IO---- 目录,概览 FileInputStream 这是一个简单的FileInputStream示例: InputStream input = new FileInputStream("D:\\input.txt"); int data = input.read(); while(data != -1) { //do something with data... doSomethingWithData(data); data = input.read()

零基础入门学习java第十四节:Java对象的克隆

今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢?什么时候需要使用呢?先来看一个小栗子: 简单起见,我们这里用的是Goods类的简单版本. public class Goods { private String title; private double price; public Goods(String aTitle, double aPri

我的MYSQL学习心得(十四)

我的MYSQL学习心得(十四) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 我的MYSQL学习心得(八) 我的MYSQL学习心得(九) 我的MYSQL学习心得(十) 我的MYSQL学习心得(十一) 我的MYSQL学习心得(十二) 我的MYSQL学习心得(十三) 这一篇<我的MYSQL学习心得(十四)>将会讲解MYSQL的备份和恢复

java IO流文件的读写具体实例(转载)

引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能找到,但自己总感觉不是很踏实,所以今天就抽空看了看java IO流的一些操作,感觉还是很有收获的,顺便总结些资料,方便以后进一步的学习... IO流的分类:1.根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader  低端流:所有的外界设备中的流都是低端流

我的MYSQL学习心得(十四) 备份和恢复

原文:我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(十) 自定义存储过程

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr

UI学习笔记---第十四天数据持久化

一.沙盒机制 每个应用程序位于文件系统的严格限制部分 每个应用程序只能在为该程序创建的文件系统中读取文件 每个应用程序在iOS系统内斗放在了统一的文件夹目录下 沙盘路径的位置 1. 通过Finder查找程序沙盘相对路径 ~/Library/Application Support/iPhone Simulator 2. 通过代码查找程序沙盘相对路径 NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearc