java I/O_字节流和字符流

1.概念
在 Java中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传
输的总称或抽象。即数据在两设备间的传输称为流,**流的本质是数据传输,**根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
1).按照流向分:输入流;输出流
2).按照处理数据的单位分:字节流(8位的字节);字符流(16位的字节)

1.1应用场景
文件传输(复制文件,删除文件或文件夹,文件改名等)
网络传输(从服务器进行数据读取,上传下载等)
硬盘数据的存储

2.何为输入和输出
(输出设备和输入设备都是站在内存的角度来看的)
输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中。
输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。
例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,也可以作为输出设备;
在这里插入图片描述
.3字节流,字符流

字节流:处理字节或二进制对象 。 InputStream, OutputStream
字符流:处理字符或字符串., Java中的字符是Unicode编码,一个字符占用两个字节。Reader , Writer
在这里插入图片描述
3.1字节流
在这里插入图片描述
(1)FileInputStream 从文件系统中的某个文件获取字节 或 读取诸如图像之类的原始字节流.
在这里插入图片描述
(2)FileOutputStream文件输出流是用于将数据写入到输出流 File 或一个 FileDescriptor 。 文件是否可用或可能被创建取决于底层平台。特别是某些平台允许一次只能打开一个文件来写入一个 FileOutputStream (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
在这里插入图片描述
2.字节缓冲流 BufferedInputStreamBufferedOutputStream
问题:为什么需要有缓冲流?
答:当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作
起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区
数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高

(1)BufferedInputStream
BufferedInputStream为另一个输入流添加了功能,即缓冲输入支持 mark 和 reset 方法的功能。 当创建 BufferedInputStream 时,将创建一个内部缓冲区数组。
当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。 mark 操作会记住输入流中的一点,并且 reset 操作会导致从最近的 mark 操作之后读取所有字节 在从包含的输入流中取出新的字节之前重新读取。
在这里插入图片描述
(2)BufferedOutputStream
在这里插入图片描述
该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为
写入的每个字节导致底层系统的调用。
在这里插入图片描述
3.2字符流
在这里插入图片描述
(1)FileReader
在这里插入图片描述
如果要从文件中读取内容,可以直接使用 FileReader 子类。
FileReader 用于读取字符流。
在这里插入图片描述
(2)FileWriter
写入字符流,向文件中写入内容
在这里插入图片描述
在这里插入图片描述
2.2、字符缓冲流 BufferedReader 和 BufferedWriter
和字节缓冲流差不多,都是为了提升性能,
提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。
BufferedReader 用于加快读取字符的速度, BufferedWriter 用于加快写入的速度。
BufferedReader 和 BufferedWriter 类各拥有 8192个 字符的缓冲区。

当 BufferedReader在 读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取.

使用 BufferedWriter 时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

(1)BufferedReader 用于加快读取字符的速度
在这里插入图片描述
(2) BufferedWriter 用于加快写入的速度。
在这里插入图片描述
在这里插入图片描述


FileReader reader=new FileReader("E:\\BIT\\bit.txt"); 
 BufferedReader bReader=new BufferedReader(reader);
 FileWriter writer=new FileWriter(":\\BIT\\bit2.txt");
 BufferedWriter bWriter=new BufferedWriter(writer);

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

3.4字符字节转换流

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

(1)InputStreamReader是Reader子类,将输入的字节流转换成字符流。
在这里插入图片描述
InputStreamReader 是从字节流到字符流的桥:它读取字节,并使用指定的 charset 将其解码为字符 。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

(2)OutputStreamWriter 是Writer的子类,将输出的字符流转换成字节流。
在这里插入图片描述
OutputStreamWriter 是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节
charset 。
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值