面试必备知识点-基础IO之流

1.流的概念

:在 Java中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传 输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象 为各种类,方便更直观的进行数据操作。

1.按照流向分:输入流;输出流
2.按照处理数据的单位分:字节流(8位的字节);字符流(16位的字节)

2. 什么是输入输出流

输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中。
输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。

例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设 备,又可以作为输出设备。

在这里插入图片描述
在这里插入图片描述

3. 什么是字节流,字符流

File类不支持文件内容处理,如果要处理文件内容,必须要通过流的操作模式来完成。
在java.io包中,流分为两种:字节流与字符流

  • 字节流:数据流中最小的数据单元是字节 。InputStream、OutputStream
  • 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节 。Reader、Writer

在这里插入图片描述
JavaIO类图

在这里插入图片描述

3.1.字节流

1.FileInputStream 和 FileOutputStream

public class FileInputStream extends InputStream {}

  • FileInputStream 从文件系统中的某个文件中获得输入字节。
  • FileInputStream 用于读取诸如图像数据之类的原始字节流。
方法解释
FileInputStream(Filefile)通过打开与实际文件的连接创建一个 FileInputStream ,该文 件由文件系统中的 File 对象 file 命名
FileInputStream(Stringname)通过打开与实际文件的连接来创建一个 FileInputStream ,该 文件由文件系统中的路径名 name 命名

public class FileOutputStream extends OutputStream

  • 文件输出流是用于将数据写入到输出流 File 或一个 FileDescriptor 。 文件是否可用或可能被 创建取决于底层平台。
  • 特别是某些平台允许一次只能打开一个文件来写入一个 FileOutputStream (或其他文件写入对 象)。
    在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
方法解释
FileOutputStream(File file)创建文件输出流以写入由指定的 File 对象表示的文件
FileOutputStream(Stringname)创建文件输出流以指定的名称写入文件。

2、字节缓冲流 BufferedInputStream 和 BufferedOutputStream

问题:为什么需要有缓冲流?

答:当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作
起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区
数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高。

public class BufferedInputStream extends FilterInputStream

  • BufferedInputStream 为另一个输入流添加了功能,即缓冲输入和支持 mark 和 reset 方法的功 能。 当创建
    BufferedInputStream 时,将创建一个内部缓冲区数组。
  • 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字 节。 mark 操作会记住输入流中的一点,并且
    reset 操作会导致从最近的 mark 操作之后读取的所 有字节在从包含的输入流中取出新的字节之前重新读取。
方法解释
BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,输 入流 in ,供以后使用。
BufferedInputStream(InputStream in,int size创建 BufferedInputStream 具有指定缓冲区大小,并保存其参数,输入流in,供以后使用

public class BufferedOutputStream extends FilterOutputStream

  • 该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为 写入的每个字节导致底层系统的调用。
方法解释
BufferedOutputStream(OutputStreamout)创建一个新的缓冲输出流,以将数据写入指定 的底层输出流。
BufferedOutputStream(OutputStreamout, int size)创建一个新的缓冲输出流,以便以指定的缓冲 区大小将数据写入指定的底层输出流。

3.2 字符流

1.字符流 FileReader 和 FileWriter

public class FileReader extends InputStreamReader

  • 如果要从文件中读取内容,可以直接使用 FileReader 子类。
  • FileReader 是用于读取字符流。 要读取原始字节流,请考虑使用 FileInputStream 。
方法解释
FileReader(File file)创建一个新的 FileReader ,给出 File 读取。
FileReader(String fileName)创建一个新的 FileReader ,给定要读取的文件的名称。

public class FileWriter extends OutputStreamWriter

  • 如果是向文件中写入内容,应该使用 FileWriter 子类
  • FileWriter 是用于写入字符流。 要编写原始字节流,请考虑使用 FileOutputStream
方法解释
FileWriter(File file)给一个File对象构造一个FileWriter对象
FileWriter(String fileName)构造一个给定文件名的FileWriter对象

2、字符缓冲流 BufferedReader 和 BufferedWriter

为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。 BufferedReader 用于加快读取字符的速度, BufferedWriter 用于加快写入的速度。

BufferedReaderBufferedWriter 类各拥有 8192个 字符的缓冲区。当 BufferedReader在 读取文 本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中 进行读取。如果缓冲区数据不足,才会再从文件中读取,使用 BufferedWriter 时,写入的数据并不会 先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出

public class BufferedReader extends Reader

  • 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取
方法解释
BufferedReader(Reader in)创建使用默认大小的输入缓冲区的缓冲字符输入 流
BufferedReader(Reader in, int sz)创建使用指定大小的输入缓冲区的缓冲字符输入 流

public class BufferedWriter extends Writer

  • 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
方法解释
BufferedWriter(Writer out)创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)创建一个新的缓冲字符输出流,使用给定大小的输出缓 冲区

3.3 字节流对比字符流

1 、字节流操作的基本单元是字节;字符流操作的基本单元为Unicode码元。
2、字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;而字符流在操作的时候使 用到缓冲区的。
3、所有文件的存储都是字节(byte)的存储,在磁盘上保留的是字节。
4、在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的 话,不会输出任何内容。

3.4 字符字节转换流

有时候我们需要进行字节流与字符流二者之间的转换,因为这是两种不同的流,所以,在进行转换的时 候我们需要用到 OutputStreamWriter 和 InputStreamReader 。

InputStreamReader 是Reader的子类,将输入的字节流转换成字符流

public class InputStreamReader extends Reader

  • InputStreamReader 是从字节流到字符流的桥:它读取字节,并使用指定的 charset 将其解码为 字符 。

  • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

方法解释
InputStreamReader(InputStream in)创建一个使用默认字符集的 InputStreamReader
InputStreamReader(InputStream in,Charset cs)创建一个使用给定字符集的 InputStreamReader

OutputStreamWriter 是Writer的子类,将输出的字符流转换成字节流。

public class OutputStreamWriter extends Writer

  • OutputStreamWriter 是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节 charset 。

  • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

方法解释
OutputStreamWriter(OutputStream out)创建一个使用默认字符编码的 OutputStreamWriter
OutputStreamWriter(OutputStream out,Charset cs)创建一个使用给定字符OutputStreamWriter
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值