缓冲流

1. 缓冲流的原理

今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士样,相当于是对基本流对象的一种增强。
在这里插入图片描述

2. BufferedOutputStream:字节缓冲

缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流: BufferedInputStream,BufferedoutputStream
  • 字符缓冲流: BufferedReadeF,BufferedWriter

缓冲流的基本原理, 是在创建流对象时,会创建一个内置的默认大小的缓冲区数组 ,通过缓冲区读写,减少系统I/O次数,从而提高读写的效率.

java. io. BufferedOutputStream extends OutputStream
BufferedoutputStream:字节缓冲输出流
继承自父类的共性成员方法:

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b):将b. length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入Len字节, 从偏移量off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节输出流。

构造方法:

  • BufferedoutputStream(OutputStream out)创建一 个新的缓 冲输出流,以将数据写入指定的底层输出流。
  • Bufferedoutputstream(OutputStream out, int size)创建一 个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输

参数:

  • OutputStream out :字节输出流。我们可以传递FileOutputStream,缓冲流会给FiLeOutputStream增加一个缓冲区,提高FiLeOutputStream的写入效率
  • int size :指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点)

  1. 创建FiLeOutputStream对象,构造方法中绑定要输出的目的地
  2. 创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象对象,提高FiLeOutputStream对象效率
  3. 使用BufferedoutputStream对象中的方法write,把数据写入到内部缓冲区中
  4. 使用Buffered0utputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
  5. 释放资源(会先调用fLush方法刷新数据,第4部可以省略)
package cn.itcast.day13.demo05;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStream01 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("C:\\Users\\x\\Desktop\\All of D\\test2\\out.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bos.write("把数据写入到缓冲区中".getBytes());
        bos.flush();
        bos.close();
    }
}
3. BufferedInputStream:字节缓冲

jjava. io. BufferedInputStream extends InputStream
jBufferedInputStream:字节缓冲输入流
继承自父类的成员方法:

  • int read()从输入流中读取数据的下一个字节。
  • int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
  • void close() 关闭此输入流并释放与该流关联的所有系统资源。

构造方法:

  • BufferedInputstream( InputStream in)创建一个
  • BufferedInputstream 并保存其参数,即输入流in, 以便将来使用。
  • BufferedInputStream( InputStream in, int size) 创建具有指定缓冲区大小的BufferedInputStream 并保存其参数,即输入流.

参数:

  • InputStream in:字节输入流
    我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率
  • int size:指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点):

  1. 创建FileInputStream对象,构造方法中绑定要读取的数据源
  2. 创建BufferedInputStream对象,构造方法中传递FiLeInputStream对象,提高FiLeInputStream对象的读取效率
  3. 使用BufferedInputStream对象中的方法read,读取文件
  4. 释放资源
package cn.itcast.day13.demo05;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class BufferedInputStream01 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\x\\Desktop\\All of D\\test2\\out.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);
        int len = 0;
        while((len = bis.read())!=-1){
            System.out.println(len);
        }
        bis.close();

    }
}
4. 文件复制练习

文件复制练习:一读一写
明确:
数据源: c:\1.jpg
数据的目的地: d:\1.jpg
文件复制的步骤:

  1. 创建字节缓冲输入流对象,构造方法中传递字节输入流
  2. 创建字节缓冲输出流对象,构造方法中传递字节输出流
  3. 使用字节缓冲输入流对象中的方法read,读取文件
  4. 使用字节缓冲输出流中的方法write,把读取的数据写入到内部缓冲区中
  5. 释放资源(会先把缓冲区中的数据,刷新到文件中)
package cn.itcast.day13.demo05;

import java.io.*;

public class CopyFile {
    public static void main(String[] args) throws IOException {
        long s = System.currentTimeMillis();
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\x\\Desktop\\All of D\\test2\\2.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\x\\Desktop\\All of D\\2.jpg"));
//        int len = 0;
//        while((len = bis.read())!=-1){
//            bos.write(len);
//        }
        //使用数组缓冲读取多个字节,写入多个字节
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = bis.read())!=-1){
            bos.write(bytes,0,len);
        }
        bos.close();
        bis.close();
        long e = System.currentTimeMillis();
        System.out.println("复制文件共耗时:" + (e-s)+ "毫秒");
    }
}
5. 字符缓冲输出流:BufferedWriter

java. io. Bufferedwriter extends writer
Bufferedwriter :字符缓冲输出流
继承自父类的共性成员方法:
void write(int c)写入单个字符。
void write(char[] cbuf)写入字符数组。
abstract void write(char[] cbuf, int off, int len)写入字符数组的某- 一部分, off数组的开始索引, len写的字符个数。
void write(String str)写入字符串。
void write(String str, int off, int Len) 写入字符串的某-部分, off字符串的开始索引, len写的字符个数。
void flush()刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。

构造方法:
Bufferedwriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
Bufferedwriter(writer out, int sz)创建一一个使用给定大小输出缓冲区的新缓冲字符输出流。
参数:
Writer out :字符输出流
我们可以传递Filewriter,缓冲流会给FileWriter增加一-个缓冲区, 提高Filewriter的写入效率
int sz:指定缓冲区的大小,不写默认大小

void newLine()写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符
换行:换行符号
windows: \r\n
linux:/n
mac:/r
使用步骤:
1.创建字符缓冲输出流对象,构造方法中传递字符输出流
2.调用字符缓冲输出流中的方法write ,把数据写入到内存缓冲区中
3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源

package cn.itcast.day13.demo05;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriter01 {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\x\\Desktop\\All of D\\test2\\buf.txt"));
        for(int i = 0; i < 10; i++ ){
            bw.write("刘亦菲");
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }
}
6. 字符缓冲输入流:BufferedReader

java. io. BufferedReader extends Reader
继承自父类的共性成员方法:
int read() 读取单个字符并返回。.
int read(char[] cbuf)一次读取多个字符,将字符读入数组。
void close() 关闭该流并释放与之关联的所有资源。

构造方法:
BufferedReader(Reader in)创建一 个使 用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int SZ)
创建一-个使用指定大小输入缓冲区的缓冲字符输入流。
参数:
Reader in:字符输入流
我们可以传递FileReader, 缓冲流会给FileReader增加一-个缓冲区。提高FileReader的读取效率
特有的成员方法:
String readline() 读取- -个文本行。读取- -行数据
行的终止符号:通过下列字符之一即可认为某行已终止: 换行(’\n’). 回车(’\r’) 或回车后直接跟着换行(\r\n)。
返回值:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null
使用步骤:
1.创建字符缓冲输入流对象,构造方法中传递字符输入流
2.使用字符缓冲输入流对象中的方法read/readL ine读取文本
3.释放资源

package cn.itcast.day13.demo05;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReader01 {
    private static String NUll;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\x\\Desktop\\All of D\\test2\\buf.txt"));
        String line;
        while((line = br.readLine())!=NUll){
            System.out.println(line);
        }
        br.close();
    }
}
7. 练习:对文本的内容进行排序

练习:
对文本的内容进行排序
按照(1,2,3… )顺序排序.
分析:
1.创建一个HashMap集合对象, 可以:存储每行本的序号CI 2日,小uolue:存储每行的文 本
2.创建字符缓冲输入流对象,构造方法中绑定字符输入流
3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
4.使用字符缓冲输入流中的方法readline,逐行读取文本
5.对读取到的文本进行切割,获取行中的序号和文本内容
6.把切割好的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1,2,3,4…)
7.遍历HashMap集合,获取每一个键值对
8.把每一一个键值对,拼接为一-个文本行
9.把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文件中
10.释放资源

package cn.itcast.day13.demo05;

import java.io.*;
import java.util.HashMap;

public class Practice {
    public static void main(String[] args) throws IOException {
        HashMap<String,String> map = new HashMap<>();
        BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\x\\Desktop\\All of D\\in.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\x\\Desktop\\All of D\\out.txt"));
        String line0;
        while((line0 = br.readLine())!=null){
            String[] arr = line0.split("\\.");
            map.put(arr[0],arr[1]);
        }

        for(String key : map.keySet()){
            String value = map.get(key);
            line0 = key + "." + value;
            bw.write(line0);
            bw.newLine();
        }
        bw.close();
        br.close();
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值