Java IO流

本文章仅供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:输入和输出流的类

字节流:InputStream OutputStream
字符流:  Reader      Writer
实质:
输出流方法:把程序里的数据传到文档里
输出流方法:把文档里的数据传到程序里

                        ________________________________________________________________

                                                                下面,我们开始详细学习

首先,我们来看看IO流的结构图


InputStream是所有输入流的超类,OutputStream是所有输出类的超类

它们的子类结构图如下




每个子类都对应相应的数据类型的输入流和输出流,这个详细的可以看API文档(有附件)

                                        下面讲解子类的介绍和类方法

InputStream类

InputStream类 {
ByteArrayInput
StringBufferInputStream 
FileInputStream
}

上面表示的是三种基本的介质流,分别从Byte数组、StringBuffer、和本地文件读取数据PipedInputStream是从与其他线程共用的管道中读取数据ObjectInputStream和所有的FileInputStream的子类都是装饰流(装饰器模式的主角)


InputStream类的方法
abstract int read();读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了末尾
                     int read(byte[]):将数据读入一个字符数组,相当于缓冲器的作用
                     intread(byte[], int off, int len) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
流结束的判断:方法read(0的返回值为-1时;readLine()的返回值为null
long skip(long n):在输入流中跳过n个字节,并返回时机跳过的字节数
int available():返回在不发生阻塞的情况下,可读取的字节数
void close() 关闭输入流,释放和这个流相关的系
统资源
void mark(int readlimit)在输入流的当前位置放置一个标志,如果读取的字节数多余readlimit设置的值,则流忽略这个标记
void reset(): 返回上一个标记
boolean markSupported()测试当前流是否支持mark和reset方法,,返回值:true和false


OutputStream类

实质:OutputStream是所有的输出字节流的父类,它是一个抽象类

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,他们分别向Byte数组、和本地文件中写入数据.

PipedOutputStream是向与其它线程共用的管道中写入数据。

ObjectOutputStream和所有的FileOutputStream的子类都是装饰流


OutputStream类的三个基本方法
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

实质: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.    流操作的数据需要编码或解码时。


 IOException异常类的子类
public class  EOFException :   非正常到达文件尾或输入流尾时,抛出这种类型的异常。    
 public class FileNotFoundException:   当文件找不到时,抛出的异常。
 public class InterruptedIOException: 当I/O操作被中断时,抛出这种类型的异常。
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值