IO流(六) 缓冲流

在我们学习字节流与字符流的时候,大家都进行过读取文件中数据的操作,读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办?

Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度

缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。

字节缓冲流

字节缓冲流根据流的方向,共有2个

  1. 写入数据到流中,字节缓冲输出流 BufferedOutputStream
  2. 读取流中的数据,字节缓冲输入流 BufferedInputStream

 

它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度

字节缓冲输出流BufferedOutputStream

通过字节缓冲流,进行文件的读写操作 写数据到文件的操作  

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.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中

    5.释放资源(会先调用flush方法刷新数据,第4部可以省略)

  1. 构造方法

public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

 

字节缓冲输入流 BufferedInputStream

刚刚我们学习了输出流实现了向文件中写数据的操作,那么,现在我们完成读取文件中数据的操作

java.io.BufferedInputStream extends InputStream

BufferedInputStream:字节缓冲输入流

 

继承自父类的成员方法:

    int read()从输入流中读取数据的下一个字节。

    int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

    void close() 关闭此输入流并释放与该流关联的所有系统资源。

 

构造方法:

    BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

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

    参数:

        InputStream in:字节输入流

            我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率

        int size:指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点):

    1.创建FileInputStream对象,构造方法中绑定要读取的数据源

    2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率

    3.使用BufferedInputStream对象中的方法read,读取文件

    4.释放资源

  1. 构造方法

public BufferedInputStream(InputStream in)

字符缓冲流

  1. 字符缓冲输入流 BufferedReader
  2. 字符缓冲输出流 BufferedWriter

完成文本数据的高效的写入与读取的操作

字符缓冲输出流 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.释放资源

  1. 方法:

void newLine() 根据当前的系统,写入一个换行符

字符缓冲输入流 BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

  1. 方法

public String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

java.io.BufferedReader extends Reader

BufferedReader:字符缓冲输入流

 

继承自父类的共性成员方法:

    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/readLine读取文本

    3.释放资源

使用字符缓冲流完成文本文件的复制

刚刚我们学习完了缓冲流,现在我们就使用字符缓冲流的特有功能,完成文本文件的复制

* 分析:
 * 	1,指定数据源, 是数据源中读数据,采用输入流
 * 	2,指定目的地,是把数据写入目的地,采用输出流
 * 	3,读数据
 * 	4,写数据
 * 	5,关闭流
 */
public class CopyTextFile {
	public static void main(String[] args) throws IOException {
		//1,指定数据源, 是数据源中读数据,采用输入流
		BufferedReader in = new BufferedReader(new FileReader("file.txt"));
		//2,指定目的地,是把数据写入目的地,采用输出流
		BufferedWriter out = new BufferedWriter(new FileWriter("copyFile.txt"));
		//3,读数据
		String line = null;
		while ( (line = in.readLine()) != null ) {
			//4,写数据
			out.write(line);
			//写入换行符号
			out.newLine();
		}
		//5,关闭流
		out.close();
		in.close();
	}
}

流的操作规律

IO流中对象很多,解决问题(处理设备上的数据时)到底该用哪个对象呢?  

把IO流进行了规律的总结(四个明确):

明确一:要操作的数据是数据源还是数据目的。

源:InputStream    Reader

目的:OutputStream Writer

先根据需求明确要读,还是要写。

 

明确二:要操作的数据是字节还是文本呢?

源:

字节:InputStream

文本:Reader

目的:

字节:OutputStream

文本:Writer

已经明确到了具体的体系上。

 

明确三:明确数据所在的具体设备。

源设备:

硬盘:文件  File开头。

内存:数组,字符串。

键盘:System.in;

网络:Socket

目的设备:

硬盘:文件  File开头。

内存:数组,字符串。

屏幕:System.out

网络:Socket

完全可以明确具体要使用哪个流对象。

 

明确四:是否需要额外功能呢?

额外功能:

转换吗?转换流。InputStreamReader OutputStreamWriter

高效吗?缓冲区对象。BufferedXXX

 

 InputStream

       FileInputStream

       BufferedInputStream

 

OuputStream

   FileOutputStream

   BufferedOuputStream

 

 

Writer

  OutputStreamWriter

     FileWriter

      BufferedWriter

 

Reader

  InputStreamReader

     FileReader

 BufferedReader

 

  1. 字节流
    1. 字节输入流 InputStream
      1. FileInputStream 操作文件的字节输入流
      2. BufferedInputStream高效的字节输入流
    2. 字节输出流 OutputStream
      1. FileOutputStream 操作文件的字节输出流
      2. BufferedOutputStream 高效的字节输出流
  2. 字符流
    1. 字符输入流 Reader
      1. FileReader 操作文件的字符输入流
      2. BufferedReader 高效的字符输入流
      3. InputStreamReader 输入操作的转换流(把字节流封装成字符流)
    2. 字符输出流 Writer
      1. FileWriter 操作文件的字符输出流
      2. BufferedWriter 高效的字符输出流
      3. OutputStreamWriter 输出操作的转换流(把字节流封装成字符流)

 

  1. 方法:
    1. 读数据方法:
      1. read() 一次读一个字节或字符的方法
      2. read(byte[]  char[]) 一次读一个数组数据的方法
      3. readLine() 一次读一行字符串的方法(BufferedReader类特有方法)
      4. readObject() 从流中读取对象(ObjectInputStream特有方法)
    2. 写数据方法:
      1. write(int) 一次写一个字节或字符到文件中
      2. write(byte[] char[]) 一次写一个数组数据到文件中
      3. write(String) 一次写一个字符串内容到文件中
      4. writeObject(Object ) 写对象到流中(ObjectOutputStream类特有方法)
      5. newLine() 写一个换行符号(BufferedWriter类特有方法)

 

  1. 向文件中写入数据的过程

1,创建输出流对象

2,写数据到文件

3,关闭输出流

  1. 从文件中读数据的过程
  1. 创建输入流对象
  2. 从文件中读数据
  3. 关闭输入流

 

  1. 文件复制的过程
  1. 创建输入流(数据源)
  2. 创建输出流(目的地)
  3. 从输入流中读数据
  4. 通过输出流,把数据写入目的地
  5. 关闭流

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值