浅谈缓冲字符流 BufferedReader BufferedWriter用法

缓冲字符流BufferedReader和BufferedWriter

问题:

之前的文件读写都是按照字节、字符或者数组来实现的,对于文本文件而言,能否按照行,一行行读写呢。

提供了BufferedReader和BufferedWriter实现按行读写

package com.bjsxt.ios3;
import java.io.*;
public class TestBufferedReaderWriter {
    public static void main(String[] args) throws IOException {
        //1.创建流
        BufferedReader br =
                new BufferedReader(new FileReader("c:/RecorderSDKLog.txt"));
        BufferedWriter bw =
                new BufferedWriter(new FileWriter("c:/RecorderSDKLog2.txt"));

        //2.使用流
        String str = br.readLine();
        while(str != null){
            //输出当前行数据
            System.out.println(str);
            //写当前行数据到文件
            bw.write(str);
            //bw.write("\n");
            bw.newLine();
            //再读一行
            str = br.readLine();
        }
        //3.关闭流
        br.close();
        bw.close();
    }
}

总结1:BufferedReader和BufferedWriter的优点

1.速度快

2.简化编程

总结2:readLine()底层的原理

底层还是一个一个字符的读取,append()放入到StringBuilder(或者char[] )中,遇到换行符 ,将StringBuilder(char[])转换成String并返回

总结3:不同的操作系统中换行符是不同的

Unix系统里,每行结尾只有“<换行>”,即“\n”;

Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;

Mac系统里,每行结尾是“<回车>”,即“\r”。

BufferedReader和BufferedWriter 性能较好的原因

原理:

BufferedReader会一次性从物理流中读取8k(默认数值,可以设置)字节内容到内存,如果外界有请求,就会到这里存取,如果内存里没有才到物理流里再去读。即使读,也是再8k。

而直接读物理流,是按字节来读。

对物理流的每次读取,都有IO操作。IO操作是最耗费时间的。

BufferedReader就是减少了大量IO操作,而为你节省了时间。

简单的说,一次IO操作,读取一个字节也是读取,读取8k个字节也是读取,两者花费时间相差不多。而一次IO的来回操作却要耗费大量时间。

好比是一辆大型汽车(设装100人),要去车站接人到公司,接一个人也是接,接100个人也是接,而时间一样。显然,接100个人最划算。

物理流就是一次一个字节(一个人)

Buffered就是一次8k个字节(100个人)

对于读取定长字节文件,当然BufferedReader更快了!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2021-07-19

Java中BufferedReader与BufferedWriter类的使用示例

BufferedReader BufferedReader 是缓冲字符输入流.它继承于Reader. BufferedReader 的作用是为其他字符输入流添加一些缓冲功能. 创建BufferReader时,我们会通过它的构造函数指定某个Reader为参数.BufferReader会将该Reader中的数据分批读取,每次读取一部分到缓冲中:操作完缓冲中的这部分数据之后,再从Reader中读取下一部分的数据. 为什么需要缓冲呢?原因很简单,效率问题!缓冲中的数据实际上是保存在内存中,而原始数据可能

自定义BufferedReader的实例

缓冲区的建立目的就是增加传输性能,使我们传输数据更加快速 缓冲区的内部其实很简单 就是在内部封装了一个数组 用数组来存储数据 对外提供一些方法对数组进行访问 其中这些方法的操作就是对数组的指针(角标). 缓冲区的原理:从源中获取一批数据到缓冲区,再从缓冲区中一个一个取出 取完后用-1作为结束标记 在BufferedReader中我们读取数据方法有read() ,readLine() read() 其参数为char[],cbuf,int off,int len.其返回值为-1 readLine()

Java BufferedWriter BufferedReader 源码分析

一:BufferedWriter 1.类功能简介: BufferedWriter.缓存字符输出流.他的功能是为传入的底层字符输出流提供缓存功能.同样当使用底层字符输出流向目的地中写入字符或者字符数组时.每写入一次就要打开一次到目的地的连接.这样频繁的访问不断效率底下.也有可能会对存储介质造成一定的破坏.比如当我们向磁盘中不断的写入字节时.夸张一点.将一个非常大单位是G的字节数据写入到磁盘的指定文件中的.没写入一个字节就要打开一次到这个磁盘的通道.这个结果无疑是恐怖的.而当我们使用Buffered

Java 中的 BufferedWriter 介绍_动力节点Java学院整理

BufferedWriter 介绍 BufferedWriter 是缓冲字符输出流.它继承于Writer. BufferedWriter 的作用是为其他字符输出流添加一些缓冲功能. BufferedWriter 函数列表  // 构造函数 BufferedWriter(Writer out) BufferedWriter(Writer out, int sz) void close() // 关闭此流,但要先刷新它. void flush() // 刷新该流的缓冲. void newLine()

InputStreamReader和BufferedReader用法及实例讲解

一.BufferedReader类 . 所属类库: java.lang.Object java.io.Reader java.io.BufferedReader . 基本概念 : public class BufferedReader    extends Reader 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值足够大. 通常, Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取

php之header的不同用法总结(实例讲解)

1.header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端. header(string,replace,http_response_code) /*string:必需.规定要发送的报头字符串. replace:可选.指示该报头是否替换之前的报头,或添加第二个报头. 默认是 true(替换).false(允许相同类型的多个报头). http_response_code:可选.把 HTTP 响应代码强制为指定的值.*/ 注意:必须在任何实际的输出被发送之前调用

PHP join()函数用法与实例讲解

PHP join() 函数 实例 把数组元素组合为一个字符串: <?php $arr = array('Hello','World!','Beautiful','Day!'); echo join(" ",$arr); ?> 定义和用法 join()函数返回一个由数组元素组合成的字符串. join() 函数是 implode() 函数的别名. 注释: join() 函数接受两种参数顺序.但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在

PHP htmlspecialchars()函数用法与实例讲解

PHP htmlspecialchars() 函数 实例 把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体: <?php $str = "This is some <b>bold</b> text."; echo htmlspecialchars($str); ?> 上面代码的 HTML 输出如下(查看源代码): <!DOCTYPE html> <html

PHP中ltrim()函数的用法与实例讲解

PHP ltrim() 函数 实例 移除字符串左侧的字符: <?php $str = "Hello World!"; echo $str . "<br>"; echo ltrim($str,"Hello"); ?> 定义和用法 ltrim()函数移除字符串左侧的空白字符或其他预定义字符. 相关函数: rtrim() - 移除字符串右侧的空白字符或其他预定义字符. trim() - 移除字符串两侧的空白字符或其他预定义字符.

Java的RxJava库操作符的用法及实例讲解

操作符就是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件.RxJava提供了很多很有用的操作符. 比如map操作符,就是用来把把一个事件转换为另一个事件的. Observable.just("Hello, world!") .map(new Func1<String, String>() { @Override public String call(String s) { r

易语言多项选择用法及实例讲解

最近发现个好玩的易语言命令啊...相当于几个如果真 就是多项选择这个命令...看下多项选择的说明 调用格式:〈通用型〉 多项选择 (整数型 索引值,通用型 待选择项数据,... ) - 系统核心支持库->其他 英文名称:choose 从参数列表项目中选择并返回一个值.本命令为初级命令.命令参数表中最后一个参数可以被重复添加. 参数<1>的名称为"索引值",类型为"整数型(int)".命令会根据本索引值来返回选择项列表中的某个值.如果索引值是 1,则

基于多线程中join()的用法实例讲解

Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行. public class TestThread5 { public static void main(String[] args) throws InterruptedException { Runner0 run5 = new Runner0(); Thread th5 = new Thread(run5); th5.start(); th5.join();//join()方法用在此处是为了等待主线程结束后运

实例讲解JS中setTimeout()的用法

本文实例讲解了JS中setTimeout()的用法,分享给大家供大家参考,具体内容如下 效果图: 具体代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascript"&

Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)

在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传递数据或组件的状态(这里将数据和状态统称为状态),但可以看到如果我们通过最基本的方式来进行通信,一旦需要管理的状态多了,代码就会变得十分臃肿和庞大.对所有状态的管理便会显得力不从心,因此,vuex出现了,他就是帮助我们把公用的状态全抽出来放在vuex的容器中,然后根据一定的规则来进行管理,我们赶紧来用一下吧,想要掌握vuex的