Java buffered stream 缓冲流


缓冲流

  • 缓冲流,也叫高效流,是在实体 I/O 上增加的一个缓冲区,应用程序和 I/O 设备之间的数据传输都要经过缓冲区来进行;
    • 使用缓冲流可以减少应用程序与 I/O 设备之间的访问次数,提高访问效率;
    • 可以对缓冲区的数据进行按需访问和预处理,增强访问的灵活性;
  • 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统 IO 次数,从而提高读写的效率;
  • 缓冲流是 4 个基本流的增强,所以也是 4 个流,按照数据类型分为:
    • 字节缓冲流:BufferedInputStream、BufferedOutputStream;
    • 字符缓冲流:BufferedReader、BufferedWriter;

1. 缓冲输入流类

  • 输入流读入的字节或字符数据都被缓冲输入流存入缓冲区,应用程序从缓冲区读取而不是从输入流读取;
  • 包括字节缓冲输入流 BufferedInputStream 类和字符缓冲输入流 BufferedReader 类;

a. BufferedInputStream(字节缓冲输入流)

  • 先通过实体输入流(例如 FileInputStream 类)对象逐一读取字节数据并存入缓冲区,应用程序则从缓冲区中读取数据;
构造方法说明
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)size 为缓冲区大小
  • BufferedInputStream 继承自 InputStream 类,与 InputStream 类使用方法相同;

b. BufferedReader(字符缓冲输入流)

  • 与 BufferedInputStream 在功能和实现上相同,但只适用于字符读入;
构造方法说明
BufferedReader(Reader in)
BufferedReader(Reader in, int size)size 为缓冲区大小
  • BufferedReader 类继承自 Reader,与 Reader 类使用方法相同;
  • 该类新增了按行读取的方法:String readLine(),该方法返回改行不包含结束符的字符串内容,如果已到达流末尾,则返回 null;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        // 创建流对象
        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\80626\\Desktop\\1.txt"));
        // 定义字符串,保存读取的一行文字
        String line = null;
        // 循环读取,读取到最后返回null
        while ((line = br.readLine()) != null) {
            System.out.print(line);
            System.out.println("------");
        }
        // 释放资源
        br.close();
    }
}
/*
输出(1.txt内容)
filename=a.txt------
length=209385038------
location=D:\a.txt------
 */

2. 缓冲输出流类

  • 输出数据时,先存入缓冲区,缓冲区满了再一次性写到输出流中;
  • 包括字节缓冲输出流 BufferedOutputStream 类和字符缓冲输出流 BufferedWriter 类;

a. BufferedOutputStream(字节缓冲输出流)

  • 存字节数据;
构造方法说明
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size)size 为缓冲区大小
  • BufferedOutputStream 继承自 OutputStream 类,与 OutputStream 类使用方法相同;

b. BufferedWriter(字符缓冲输出流)

  • 与 BufferedOutputStream 在功能和实现上相同,但只适用于字符读入;
构造方法说明
BufferedWriter(Writer out)
BufferedWriter(Writer out, int size)size 为缓冲区大小
  • BufferedWriter 类继承自 Writer,与 Writer 类使用方法相同;
  • 该类新增了按行读取的方法:String newLine(),行分割字符串由系统属性 line.separator 定义;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        // 创建流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\80626\\Desktop\\2.txt"));
        // 写出数据
        bw.write("3");
        // 写出换行
        bw.newLine();
        bw.write("2.5");
        bw.newLine();
        bw.write("");
        bw.newLine();
        // 释放资源
        bw.close();
    }
}
/*
文件
3
2.5
 */

3. 综合应用

  • 写入并读取文件内容:
import java.io.*;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        File file;
        FileReader fin;
        FileWriter fout;
        BufferedReader bin;
        BufferedWriter bout;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入文件名,例如C:\\Users\\80626\\Desktop\\1.txt");
        String filename = scanner.nextLine();

        try {
            file = new File(filename);//创建文件对象
            if (!file.exists()) {
                file.createNewFile();//创建新文件
                fout = new FileWriter(file);//创建文件输出流对
            } else
                fout = new FileWriter(file, true);//创建追加内容的文件输出流对象

            fin = new FileReader(file);//创建文件输入流
            bin = new BufferedReader(fin);//创建缓冲输入流
            bout = new BufferedWriter(fout);//创建缓冲输出流

            System.out.println("请输入数据,最后一行为字符‘0’结束。");
            String str = scanner.nextLine();//从键盘读取待输入字符串
            while (!str.equals("0")) {
                bout.write(str);//输出字符串内容
                bout.newLine();//输出换行符
                str = scanner.nextLine();//读下一行
            }
            bout.flush();//刷新输出流
            bout.close();//关闭缓冲输出流
            fout.close();//关闭文件输出流
            System.out.println("文件写入完毕!");

            //重新将文件内容显示出来
            System.out.println("文件" + filename + "的内容是:");
            while ((str = bin.readLine()) != null)
                System.out.println(str);//读取文件内容并显示

            bin.close();//关闭缓冲输入流
            fin.close();//关闭文件输入流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/*
输出
请输入文件名,例如C:\Users\80626\Desktop\1.txt
C:\Users\80626\Desktop\1.txt
请输入数据,最后一行为字符‘0’结束。
werqewrqrwqer

arqewrq
0
文件写入完毕!
文件C:\Users\80626\Desktop\1.txt的内容是:
Hello World!!!werqewrqrwqer

arqewrq

文件
Hello World!!!werqewrqrwqer

arqewrq
 */

推荐阅读:[Java] 文本排序 >>>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值