系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader
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 同样。
系统学习 Java IO (十四)----字符读写缓存和回退 BufferedReader/BufferedWriter & PushbackReader的更多相关文章
- 系统学习 Java IO (十五)----字符读写 Reader/Writer 其他子类
目录:系统学习 Java IO---- 目录,概览 跟踪行号的缓冲字符输入流 LineNumberReader LineNumberReader 类是一个 BufferedReader ,用于跟踪读取 ...
- 系统学习 Java IO (十六)----这么多类,应该用哪个?
目录:系统学习 Java IO---- 目录,概览 Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 类的许多子类. 原 ...
- 系统学习 Java IO (十二)----数据流和对象流
目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...
- 系统学习 Java IO (十)----回退流 PushbackInputStream
目录:系统学习 Java IO---- 目录,概览 PushbackInputStream 旨在从 InputStream 解析数据时使用. 有时您需要先读取几个字节以查看将要发生的事情,然后才能确定 ...
- 系统学习 Java IO ---- 目录,概览
Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...
- 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream
目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...
- 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类
目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...
- 系统学习 Java IO (四)----文件的读写和随机访问 FileInputStream/FileOutputStream & RandomAccessFile
目录:系统学习 Java IO---- 目录,概览 文件输入流 FileInputStream 这是一个简单的FileInputStream示例: InputStream input = new Fi ...
- 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...
随机推荐
- WebView 联系(要么button)至 Activity 跳跃在几个方面
第一 ,写一个 JavaScriptinterface 分类.内实现WebView至Activity 页面跳转 public class JavaScriptinterface { Activity ...
- 数值范围选择控件RangeSlider
原文:数值范围选择控件RangeSlider RangeSlider控件用于在一个指定上下限的范围中选择一个数值范围,因此该控件的Maximum和Minimum属性用于指定上下限:而Selection ...
- 【C语言学习】C语言功能
代码,功能为了更好地实现模块化编程.那么,什么是函数的性质?在函数中定义的变量(全局变量.局部变量.静态变量)如何存储?为什么范围和全局变量和局部变量的寿命是不一样的?只是有一个更深入的了解的功能.能 ...
- IOS status bar
从iOS7开始,该系统提供2样的管理风格状态栏 由UIViewController管理(每UIViewController我们可以有各自不同的状态栏) 由UIApplication管理(由其统一管理的 ...
- debian9 安装 odoo11 笔记用 部分内容转载前辈的,在此感谢
1先创建个odoo用户 sudo adduser odoo 2:给root 权限: sudo vi /etc/sudoers 修改文件参考如下: # User privilege specificat ...
- C#并口热敏小票打印机打印位图
原文:C#并口热敏小票打印机打印位图 最近一直在研究并口小票打印机打印图片问题,这也是第一次和硬件打交道,不过还好,最终成功了. 这是DEMO的窗体: 下面是打印所需要调用的代码: class ...
- WPF小笔记-Popup拖动
查看了下MSDN发现Popup没有类拟Drag相关的属性和方法,第一时间想了thumb.忙了一会未果,就想起了强大的google. 发现中文资料很少,英文的发现有两篇很不错的,所以笔记在博客园里,希望 ...
- WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...
- iOS Touch ID使用
1.首先导入头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.关键代码 - (void)validateTouchID { ...
- miniui处理多重子表级联,一次性提交多表数据的ui要点
在一个ui界面上 有a,b,c三个表 a表只有一条记录,b表有多条记录,c表有多条记录 b是a的子表,c是b的子表 都是一对多关系 一次性下载相关联的c表记录 然后mini-datagrid采用cli ...