java中的其它 IO 流 —— 缓存流

之前学习过一些基础的流
-------------------java中的io流——字节流
-------------------java中的io流——字符流
今天学一些功能更强大的流,这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。

缓冲流

分类:
字节缓冲流: BufferedInputStream , BufferedOutputStream
字符缓冲流: BufferedReader , BufferedWriter

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

字节缓冲输出流( BufferedOutputStream)
  • 继承关系:
    java.io.BufferedOutputStream extends OutputStream

    意味着 字节缓冲输出流( BufferedOutputStream)可以继承自父类的 共性成员方法

  • 构造方法:

     BufferedOutputStream(OutputStream out)  创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
     BufferedOutputStream(OutputStream out, int size)  创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
     参数:
        OutputStream out:字节输出流
             我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
        int size:指定缓冲流内部缓冲区的大小,不指定默认
    

入门案例:

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

public class Demo01{
    public static void main(String[] args) throws IOException {
    
        //1.创建FileOutputStream对象,构造方法中绑定要输出的目的地
        FileOutputStream fos = new FileOutputStream("e:/a.txt");
        //2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象对象,提高FileOutputStream对象效率
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
        bos.write("这里是BufferedOutputStream".getBytes());
        //4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
        bos.flush();
        //5.释放资源(会先调用flush方法刷新数据,第4部可以省略)
        bos.close();
        
    }
}

不用关闭 fos,直接关闭 bos 就可以了。因为一关闭缓冲流,就把基本的字节流给关闭了。

字节缓冲输入流( BufferedInputStream)
  • 继承关系:
    java.io.BufferedInputStream extends InputStream

    意味着 字节缓冲输入流( BufferedInputStream)可以继承自父类 共性成员方法

  • 构造方法:

     BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
     BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
      参数:
         InputStream in:字节输入流
             我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率
         int size:指定缓冲流内部缓冲区的大小,不指定默认
    

入门案例:

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

public class Demo02 {
    public static void main(String[] args) throws IOException {
    
        //1.创建FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("e:/a.txt");
        //2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率
        BufferedInputStream bis = new BufferedInputStream(fis);
        //3.使用BufferedInputStream对象中的方法read,读取文件

	    int size=bis.available();
	    byte[] bytes=new byte[size];
	    
        int len = 0; //记录每次读取的有效字节个数
        while((len = bis.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
        //4.释放资源
        bis.close();
        
    }
}

这里对 read() 和 String() 陌生的同学,要回去复习哦!!!

使用缓冲流复制文件:
本质 : 一读一写

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

public class CopyTest1 {
	    public static void main(String[] args) throws IOException {
	        long s = System.currentTimeMillis();
	        //1.创建字节缓冲输入流对象,构造方法中传递字节输入流
	        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("e:/壁纸.png"));
	        //2.创建字节缓冲输出流对象,构造方法中传递字节输出流
	        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:/壁纸5.png"));

	     	//返回这个输入流中可以被读的剩下的bytes字节的估计值;
	        int size=bis.available();
	        //根据输入流中的字节数创建byte数组;
	        byte[] bytes=new byte[size];
	        int len = 0;
	        while((len = bis.read(bytes))!=-1){
	            bos.write(bytes,0,len);
	        }

	        bos.close();
	        bis.close();

	        long e = System.currentTimeMillis();
	        System.out.println("复制文件共耗时:"+(e-s)+"毫秒");
	    }
	}

在这里插入图片描述

通过与 字节流 对比发现,用 缓冲流 进行文件的复制比 基本流 快一点。

高效的策略:
1、使用数组缓冲读取多个字节,写入多个字节
2、用缓冲流

字符号缓冲输出流( BufferedWriter)
  • 继承关系:
    java.io.BufferedWriter extends Writer

    意味着 字符号缓冲输出流( BufferedWriter)可以继承自父类 共性成员方法

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

  • 特有的成员方法:
    void newLine() 写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符,代替:\r\n /n /r

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

public class Demo03BufferedWriter {
    public static void main(String[] args) throws IOException {
        //1.创建字符缓冲输出流对象,构造方法中传递字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("e:/c.txt"));
        //2.调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中
        for (int i = 0; i <10 ; i++) {
            bw.write("传智播客");
            bw.newLine();
        }
        //3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
        bw.flush();
        //4.释放资源
        bw.close();
    }
}

字符号缓冲输入流( 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

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

public class BufferedReader {
    public static void main(String[] args) throws IOException {
        //1.创建字符缓冲输入流对象,构造方法中传递字符输入流
        BufferedReader br = new BufferedReader(new FileReader("e:/c.txt"));

        //2.使用字符缓冲输入流对象中的方法read/readLine读取文本
        String line;
        while((line = br.readLine())!=null){
            System.out.println(line);
        }

        //3.释放资源
        br.close();
    }
}

缓冲流的综合案例:

要求:
对文本的内容进行排序
按照(1,2,3…)顺序排序

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

public class Demo05 {
    public static void main(String[] args) throws IOException {
        //1.创建一个HashMap集合对象,可以:存储每行文本的序号(1,2,3,..);value:存储每行的文本
        HashMap<String,String> map = new HashMap<>();
        //2.创建字符缓冲输入流对象,构造方法中绑定字符输入流
        BufferedReader br = new BufferedReader(new FileReader("e:/in.txt"));
        //3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("e:/out.txt"));
        //4.使用字符缓冲输入流中的方法readline,逐行读取文本
        String line;
        while((line = br.readLine())!=null){
            //5.对读取到的文本进行切割,获取行中的序号和文本内容
            String[] arr = line.split("\\.");
            //6.把切割好的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1,2,3,4..)
            map.put(arr[0],arr[1]);
        }

        //7.遍历HashMap集合,获取每一个键值对
        for(String key : map.keySet()){
            String value = map.get(key);
            //8.把每一个键值对,拼接为一个文本行
            line = key + "." + value;
            //9.把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文件中
            bw.write(line);
            bw.newLine();//写换行
        }
        //10.释放资源
        bw.close();
        br.close();
    }
}

1、split() 的用法:
stringObj.split([separator,[limit]])
参数

  • separator 可选项。字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。

  • limit 可选项。该值用来限制返回数组中的元素个数。

(1)如果用"."作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
(2)如果用"|"作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
(3)如果用"\"作为分隔,就得写成这样:String.split("\\\\"),因为在Java中是用"\\"来表示"\"的, ".""|""\"都是转义字符,必须得加"\";
(4)如果在一个字符串中有多个分隔符,可以用"|“作为连字符,比如:”acount=? and uu =? or n=?",把三个都分隔出来,可以用String.split("and|or");
2、熟记 map 的取值方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值