【Java学习笔记】I/O

时间:2023-02-14 23:43:33

-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------

Java I/O初学笔记


先来看一张I/O的体系图吧:

【Java学习笔记】I/O


一、简介

I/O简而言之就是各种媒介之间进行数据交换。本文主要介绍Java中常用的输入输出流。Java的I/O包中Stream类根据操作的对象分为字符流和字节流。


二、分类

Java的I/O操作,主要可以分为下面四类:

1、字符流:Reader(读),Writer(写);参见上图右半部分

2、字节流:InputStream(输入流),OutputStream(输出流);参见上图左半部分

3、盘符:File(文件类)

4、网络:Socket(位于java.net包下,不在java.io里)


三、详细介绍

3.1字符流

Reader和Writer都是抽象类,具体的读写操作可以使用已经实现的FileReader和FileWriter两个子类。还有两个已经实现的带缓冲区的子类BufferedReader和BufferedWriter,我们来看看官方API是怎么介绍的:

【Java学习笔记】I/O

公共类BufferedReader继承自Reader。

从字符输入流中读取文本信息,字符缓冲区用来高效读取字符,数组,行。缓冲区的大小可能被设定,或者默认的大小可供使用。缓冲区的默认大小足够大部分情况使用了。

一般的,每次读请求都会在底层生成相应的字符或字节流读请求对象,因此,对于用FileReaders和InputStreamReaders等消耗较高的操作,使用其他Reader对象包裹BufferedReder是很明智的。


【Java学习笔记】I/O

公共类BufferedWriter继承自Writer

从字符输流中写入文本信息,字符缓冲区用来高效写入字符,数组,行。缓冲区的大小可能被设定,或者默认的大小可供使用。缓冲区的默认大小足够大部分情况使用了。

newLine()方法是根据所运行的平台自身定义的行终止符来定义的一行的终止,并不是所有的平台都使用“\n”来作为一行的结束。因此使用newLine()来结束一行的输出,要比直接使用“\n”好。

一般的,除非有输出提示,writer对象会立即输出基本字符或字节。对于用FileWriters和OutputStreamWriters等消耗较高的操作,使用其他Reader对象包裹BufferedWriter是很明智的。

通过API我们可以很直接的了解到,FileReader和FileWriter配合BufferedReder和BufferedWriter效率会更高。


3.2字节流

InputStream和OutputStream是字节流的两个父类,也都是抽象类。同字符流一样,字节流也提供了两个常用的以实现的子类FileInputStream和FilieOutputStream来读取文件。我们查看API的介绍:【Java学习笔记】I/O

公共类FileInputStream继承自InputStream

FileInputStream对象从系统的一个文件中获取字节到另一个文件。文件是否可用,取决于系统的环境。

FileInputStream主要用来读取字节流,比如图片数据。如果要读取字符,可以考虑使用FileReader。


【Java学习笔记】I/O

公共类FileOutputStream继承自OutputStream

文件输出流是写入数据到文件或者文件说明符中的一种输出流。无论一个文件是否可用或者可能被创建则取决于运行的平台。特别的,一些平台在一定时间内只允许一个FileOutputStream对象(或其它文件写入对象)打开一个文件以供写入。在这种情况下,如果一个文件已经被打开,那么FileOutputStream类的构造函数将会失败。

FileOutputStream主要用来写入字节流,比如图片数据。如果要写入字符,可以考虑使用FileWriterr。

字节流的两个子类都有提示,如果要读写字符数据,建议使用字符流。这是因为一个字符占两个字节,如果是文本文档,那么使用字节流,读写两次才可以读完一个汉字,但是字符流一次就可以读写一个字符,加上字符流可以配合BufferedReder和BufferedWriter使用,所以效率会比字节流高很多。同样的,图片和视频等数据是以二进制字节存储的,所以使用字节流读写图片等数据会更方便。


四、小结

字节流以字节为单位读,字符流以字符为单位读取数据Java的I/O主要有两个超:inputstream和outputstream字节流类,以及Reader和Writer字符流类

字节流和字符流之间通过 InputStreamReader和OutputStreamWriter来转换,也就是通过byte数组(字节)和String(字符)来关联,也可以理解为字节和字符之间转换。


今天主要都是理论部分,明天补充代码实例。文章如有错误,欢迎指正。