Java IO流 - 缓冲流的详细使用介绍

简介: 缓冲流也称为高效流、或者高级流。之前学习的字节流和字符流可以称为原始流。作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能

缓冲流

缓冲流概述

缓冲流介绍:


缓冲流也称为高效流、或者高级流。之前学习的字节流和字符流可以称为原始流。


作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能




缓冲流分为: 字节缓存输入流、字节缓冲输出流、字符缓冲输入流、字符缓冲输出流




字节缓冲流

字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上与原始流相比并无变化。


字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能,读写功能上与原始流相比并无变化。


字节缓冲流性能优化原理:


字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。


字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。


将原始流包装为缓冲流的构造器如下:


构造器 说明

BufferedInputStream(InputStream is) 可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能

BufferedOutputStream(OutputStream os) 可以把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能

public static void main(String[] args) throws Exception {

   // 创建原始字节输入流

   InputStream is = new FileInputStream("/Users/chenyq/Documents/test.txt");

   // 创建原始字节输出流

   OutputStream os = new FileOutputStream("/Users/chenyq/Documents/test1.txt");


   // 将低级的字节输入流包装为高级的缓存输入流

   InputStream bis = new BufferedInputStream(is);

   // 将低级的字节输出流包装为高级的缓存输出流

   OutputStream bos = new BufferedOutputStream(os);

}


读写功能和之前原始流的读写并无区别:


public static void main(String[] args) {

   try (

           // 创建原始字节输入流

           InputStream is = new FileInputStream("/Users/chenyq/Documents/test.txt");

           // 创建原始字节输出流

           OutputStream os = new FileOutputStream("/Users/chenyq/Documents/test1.txt");


           // 将低级的字节输入流包装为高级的缓存输入流

           InputStream bis = new BufferedInputStream(is);

           // 将低级的字节输出流包装为高级的缓存输出流

           OutputStream bos = new BufferedOutputStream(os);

   ) {

       // 文件拷贝: 读写操作

       byte[] arr = new byte[1024];

       int len;

       while ((len = bis.read(arr)) != -1) {

           bos.write(arr, 0, len);

       }

   } catch(Exception e) {

       e.printStackTrace();

   }

}


作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。


字符缓存输入流构造器如下:


构造器 说明

BufferedReader(Reader r) 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能

public static void main(String[] args) throws Exception {

   // 创建原始字符输入流

   Reader r = new FileReader("/Users/chenyq/Documents/test.txt");

   // 将原始字符输入流包装为字符缓存输入流

   Reader br = new BufferedReader(r);

}


字符原始输入流的方法字符缓存输入流同样适用:


public static void main(String[] args) {

   try (

           // 创建原始字符输入流

           Reader r = new FileReader("/Users/chenyq/Documents/test.txt");

           // 将原始字符输入流包装为字符缓存输入流

           Reader br = new BufferedReader(r);

           ){

       // 读取文件

       char[] arr = new char[1024];

       int len;

       while ((len = br.read(arr)) != -1) {

           String res = new String(arr, 0, len);

           System.out.println(res);

       }

   } catch (Exception e) {

       e.printStackTrace();

   }

}



字符缓存输入流在原有的方法上新增了方法:


方法 说明

readLine() 读取一行数据, 并返回该行内容的字符串,无行可读返回null

按行读取: 普通方法


public static void main(String[] args) {

   try (

           Reader r = new FileReader("/Users/chenyq/Documents/test.txt");

           BufferedReader br = new BufferedReader(r);

           ){


       // 读取第一行

       System.out.println(br.readLine());


   } catch (Exception e) {

       e.printStackTrace();

   }

}


按行读取: 循环方法


public static void main(String[] args) {

   try (

           Reader r = new FileReader("/Users/chenyq/Documents/test.txt");

           BufferedReader br = new BufferedReader(r);

           ){


       String res;

       while ((res = br.readLine()) != null) {

           System.out.println(res);

       }


   } catch (Exception e) {

       e.printStackTrace();

   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

字符缓存输出流:


字符缓冲输出流:实现类BufferedWriter。


作用:提高字符输出流写取数据的性能,除此之外多了换行功能


字符缓存输出流构造器如下:


构造器 说明

BufferedWriter(Writer w) 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能

public static void main(String[] args) throws Exception {

   Writer w = new FileWriter("/Users/chenyq/Documents/test.txt");

   // 将原始字符输出流包装为缓冲输出流

   Writer bw = new BufferedWriter(w);

相关文章
|
15天前
|
Java Unix Windows
|
19小时前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
5 0
|
5天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
13 1
|
9天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
17 1
|
10天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
20 2
|
11天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
16天前
|
存储 Java 数据库
[Java 基础面试题] IO相关
[Java 基础面试题] IO相关
|
17天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
16 1
|
4月前
|
存储 Java 数据安全/隐私保护
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
|
25天前
|
存储 缓存 Java
【Java IO系列】那字节流和字符流有什么区别?
而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
19 1
【Java IO系列】那字节流和字符流有什么区别?