-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java I/O初学笔记
先来看一张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是怎么介绍的:
公共类BufferedReader继承自Reader。
从字符输入流中读取文本信息,字符缓冲区用来高效读取字符,数组,行。缓冲区的大小可能被设定,或者默认的大小可供使用。缓冲区的默认大小足够大部分情况使用了。
一般的,每次读请求都会在底层生成相应的字符或字节流读请求对象,因此,对于用FileReaders和InputStreamReaders等消耗较高的操作,使用其他Reader对象包裹BufferedReder是很明智的。
公共类BufferedWriter继承自Writer
从字符输出流中写入文本信息,字符缓冲区用来高效写入字符,数组,行。缓冲区的大小可能被设定,或者默认的大小可供使用。缓冲区的默认大小足够大部分情况使用了。
newLine()方法是根据所运行的平台自身定义的行终止符来定义的一行的终止,并不是所有的平台都使用“\n”来作为一行的结束。因此使用newLine()来结束一行的输出,要比直接使用“\n”好。
一般的,除非有输出提示,writer对象会立即输出基本字符或字节。对于用FileWriters和OutputStreamWriters等消耗较高的操作,使用其他Reader对象包裹BufferedWriter是很明智的。
通过API我们可以很直接的了解到,FileReader和FileWriter配合BufferedReder和BufferedWriter效率会更高。
3.2字节流
InputStream和OutputStream是字节流的两个父类,也都是抽象类。同字符流一样,字节流也提供了两个常用的以实现的子类FileInputStream和FilieOutputStream来读取文件。我们查看API的介绍:
公共类FileInputStream继承自InputStream
FileInputStream对象从系统的一个文件中获取字节到另一个文件。文件是否可用,取决于系统的环境。
FileInputStream主要用来读取字节流,比如图片数据。如果要读取字符,可以考虑使用FileReader。
公共类FileOutputStream继承自OutputStream
文件输出流是写入数据到文件或者文件说明符中的一种输出流。无论一个文件是否可用或者可能被创建则取决于运行的平台。特别的,一些平台在一定时间内只允许一个FileOutputStream对象(或其它文件写入对象)打开一个文件以供写入。在这种情况下,如果一个文件已经被打开,那么FileOutputStream类的构造函数将会失败。
FileOutputStream主要用来写入字节流,比如图片数据。如果要写入字符,可以考虑使用FileWriterr。
字节流的两个子类都有提示,如果要读写字符数据,建议使用字符流。这是因为一个字符占两个字节,如果是文本文档,那么使用字节流,读写两次才可以读完一个汉字,但是字符流一次就可以读写一个字符,加上字符流可以配合BufferedReder和BufferedWriter使用,所以效率会比字节流高很多。同样的,图片和视频等数据是以二进制字节存储的,所以使用字节流读写图片等数据会更方便。
四、小结
字节流以字节为单位读取数据,字符流以字符为单位读取数据。Java的I/O主要有两个超类:inputstream和outputstream字节流类,以及Reader和Writer字符流类。
字节流和字符流之间通过 InputStreamReader和OutputStreamWriter来转换,也就是通过byte数组(字节)和String(字符)来关联,也可以理解为字节和字符之间转换。
今天主要都是理论部分,明天补充代码实例。文章如有错误,欢迎指正。