本文章仅供Java的初学者查阅和学习
跟大家分享一下我的Java IO流的学习心得
在学习一个新知识前,我们应该先对它的概念进行了解:
概念理解: 绝对路径与相对路径
所谓“绝对路径”就是从根目录开始一直到该目录的全程的路径。
举个例子:"c:\apache\htdocs\cgi-bin\test.cgi"就是文件test.cgi的绝对路径。
所谓“相对路径”就是相对于当前目录的路径。
举个例子:例如当前目录目录是 "c:\apache\htdocs" 你要浏览 c:\apache\htdocs\cgi-bin\test.cgi文件的内容,那么只需在命令行里输入 "type cgi-bin\test.cgi" 就可以了,要是在"c:\apache\htdocs\cgi-bin\xyz"下呢,那么就是 "type ..test.cgi"。
简单说:绝对路径必须从哪个盘开始,相对路径是从当前目录开始操作。
注意: 绝对路径是不变的,而相对路径是随用户工作目录的变化而变化。
2:字符流和字节流
简单来说:如果你能打开一个文档(文件)并能读懂里面的内容,文档里面的内容就是字符流,如果读不懂就是字节流
3:每种流的命名都是以其基类的名字作为后缀
遍历一个父目录下的所有子目录的算法
/
* 自定义一个父目录字符串然后将它 转化为抽象路径;
* 遍历该抽象路径的所有子目录,如 果是文件夹就输出
* 运用递归的方法来遍历
*/
4:输入和输出流的类
________________________________________________________________
下面,我们开始详细学习
首先,我们来看看IO流的结构图
InputStream是所有输入流的超类,OutputStream是所有输出类的超类
它们的子类结构图如下
每个子类都对应相应的数据类型的输入流和输出流,这个详细的可以看API文档(有附件)
下面讲解子类的介绍和类方法
InputStream类
上面表示的是三种基本的介质流,分别从Byte数组、StringBuffer、和本地文件读取数据PipedInputStream是从与其他线程共用的管道中读取数据ObjectInputStream和所有的FileInputStream的子类都是装饰流(装饰器模式的主角)
实质:OutputStream是所有的输出字节流的父类,它是一个抽象类
ByteArrayOutputStream、FileOutputStream是两种基本的介质流,他们分别向Byte数组、和本地文件中写入数据.
PipedOutputStream是向与其它线程共用的管道中写入数据。
ObjectOutputStream和所有的FileOutputStream的子类都是装饰流
abstract void write(int b):往输出流中写入一个字节
void write(byte[]b):往输出流中写出数组中的b的所有字节
void write(byte [] b,int off,int len ):往输出流中写入数组b中从偏移量off开始的len字节的数据
其他方法
void flush():刷新输出流,强制缓冲流中的所有数据被写出
void close():关闭输出流,释放和这个流相关的系统资源
实质:Reader是所有的输入字符流的父类,它是一个抽象类。
CharReader、StringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。
PipedReader是从与其它线程共用的管道中读取数据。
BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。
FileReader是所有自定义具体装饰流的父类,其子类Pushback对Reader对象进行装饰,会增加一个行号
InputStreamReader是一个连接字节流和字符流的桥梁,他将字节流转为字符流。Reader的三个基本方法:
public int read() throws IOException; //读取一个字符,返回值为读取的字符
public int read(char cbuf[]) throws IOException; /*读取一系列字符到数组cbuf[]中,返回值为实际读取的字 符的数量*/
public abstract int read(char cbuf[],int off,int len) throws IOException;
读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现
字符输出流:Write
实质:Writer是所有的输出字符流的父类,它是一个抽象类。
CharArrayWriter、StringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据,
BufferedWriter 是一个装饰器为Writer提供缓冲功能。
PrintWriter和PrintStream极其类似,功能和使用也非常相似。
OutputStreamWriter是OutputStream到Writer转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream极其类似.
主要方法:
(1) public void write(int c) throws IOException; //将整型值c的低16位写入输出流
(2) public void write(char cbuf[]) throws IOException; //将字符数组cbuf[]写入输出流
(3) public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流
(4) public void write(String str) throws IOException; //将字符串str中的字符写入输出流
(5) public void write(String str,int off,int len) throws IOException; //将字符串str 中从索引off开始处的len个字符写入输出流 _______________________________________________________________________________
拓展:字符流与字节流转换、
先了解字节流跟字符流
字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。
· 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
· 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
转换流的特点:
1. 其是字符流和字节流之间的桥梁2. 可对读取到的字节数据经过指定编码转换成字符
3. 可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
1. 当字节和字符之间有转换动作时;
2. 流操作的数据需要编码或解码时。
public class FileNotFoundException: 当文件找不到时,抛出的异常。
public class InterruptedIOException: 当I/O操作被中断时,抛出这种类型的异常。