流是字节的序列的抽象概念,数据流向,主要用于硬盘、内存、IO设备上的数据操作。
Java流分为三类:
1.按照处理数据大小:字节流和字符流
2.按照流的方向:输入流和输出流
3.按照功能分为:节点流和处理流
字节流和字符流:
1)字节流 : 读取数据的最小单位是字节,8bit,有两个抽象基类InputStream/OutputStream,可以处理设备上的所有类型数据。
2)字符流:读取数据的最小单位是字符,原理是基于字节流读取字节后查询指定编码表,返回对应字符,有两个抽象基类Reader/Writer,只能处理文本类型数据。
InputStream中常见的方法:
–int read()
读取一个字节,返回值为所读得字节
–int read(byte b[])
读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际独取的字节的数量。
–int read(byte b[] ,int off,int len)
读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量。
–int available()
返回值为流中尚未读取的字节的数量。
–long skip(long n)
读指针跳过n个字节不读,返回值为实际跳过的字节数量
–close()
流操作完毕后必须关闭
–mark(int readlimit)
纪录当前指针的所在位置.readlimit表示读指针读出的readlimit个字节后所标记的指针位置才实效。
–reset()
把读指针重新指向用mark方法所记录的位置
–boolean markSupported()
当前的流是否支持读指针的记录功能。
OutputStream中常见的方法:
–write(int b)
往流中写一个字节b
–write(byte b[])
往流中写一个字节数组b
–write(byte b[],int off,int len)
把字节数组b中从下标off开始,长度为len的字节写入流中
–flush()
刷空输出流,并输出所有被缓存的字节,由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
–close()
流操作完毕后必须关闭。
Reader中常见的方法:
–int read()
读取一个字符,并返回读到的这个字符,读到流的末尾则返回-1。
–int read(char[])
将读到的字符存入指定的数组中,返回的是读到的字符个数,
读到流的末尾则返回-1。
–close()
读取字符其实用的是window系统的功能,就希望使用完毕后,
进行资源的释放。
FileReader除了自己的构造函数外没有特有的方法:
–用于读取文本文件的流对象。
–用于关联文本文件。
–构造函数FileReader(String fileName)
在读取流对象初始化时,必须要指定一个被读取的文件,
如果该文件不存在则会发生FileNotFoundException异常。
Writer中常见的方法:
–write()
将一个字符写入到流中。
–write(char[])
将一个字符数组写入到流中。
–writer(String)
将一个字符写入到流中。
–flush()
刷新流,将流中的数据刷新到目的地中,流还存在。
–close()
关闭资源,在关闭钱会先调用flush(), 刷新流中的数据到目的地。
输入流和输出流:
1)输入流:文件----》程序
2)输出流:程序----》文件
处理流和节点流(重点介绍):
1)节点流:直接对数据源进行读写操作
2)处理流:在节点流的基础上,通过装饰(装饰模式)增强功能对数据源间接读写操作
1)缓冲流(Buffered):节点流之上进行加工,添加缓冲区(FileInputStream=>BufferedInputStream)这样避免读取文件时候,大量进行对硬盘的读写,而是从缓冲区进行读写,提高读写效率。
2)转换流(StreamReader):即字节流与字符流的相互转换。比如:在进行读写字节流设备时候,我想调用读取字符流的函数,就可以通过转换流。将(字节流=>字符流) InputStreamReader in=new InputStreamReader(new InputStream())注意只能是字节流转换为字符流!!
3) 数据流(Data):当读取写入具体的数值数据时候(Long Double)就可以采用DataInputStream和DataOutputStream流进行功能更加强大的写入和读取功能。