数据流(Stream)是指数据通信的通道。
Java程序中对数据的输入、输出操作是以流的方式进行的,JDK又提供了各种流类,来获取不同种类的的数据。
流的分类:
按流向分
·输入流:从文件、网络、内存等(数据源)到程序中,是read的过程,是input的过程,处理这样事物的流,是输入流。
·输出流:从程序到文件,网络,内存等,是写的过程这样的流是输出流。
按传输的单位:
·字节流:以字节为传输的单位。8bit = 1byte 处理二进制文件,包括mp3,jpg,exe,doc,ppt,pdf...Java中以Stream结尾的流都是字节流。
·字符流:以字符为传输的单位。以reader结尾的流是输入字符流,以writer结尾的流是输出字符流。
按功能(层次):
·节点流:用于直接操作目标设备的流。
·处理流:对一个已存在的流的连接和封装,通过对数据的处理为程序提供更为强大,灵活的读写功能。
JDK提供的相关类:InputStream、OutStream、Reader、Writer。四个都是抽象类。
字节流 | 字符流 | |
输入流 | InputStrean | Reader |
输出流 | OutputStream | Writer |
可以这样理解类中含有Stream的是字节流,含有Reader、Writer的是字符流,带有Input、Reader的是输入流,带有Output、Writer的是输出流。
InputStream:继承此类的流都是输入流。数据读取的单位是一个字节(8位)。
public abstractint read() throws IOException:从输入流中读取数据的下一个字节。读到末尾返回-1;
public intread(byte[] b) throws IOException:从输入流中读取b.length 个字节的数据并存储到缓冲区数组b中.返回的是实际读到的字节总数。
public voidclose() throws IOException:关闭此输入流并释放与此流关联的所有系统资源。
OutputStream:继承此类的都是输出流,数据单位是字节(8位)。
public abstractvoid write(int b) throws IOException:将指定的字节写入此输出流
public voidwrite(byte[] b) throws IOException:将 b.length个字节从指定的 byte 数组写入此输出流
public voidflush() throws IOException:刷新此输出流并强制写出所有缓冲的输出字节。如果输出的,要立即看到结果。需要使用此方法,因为在输出流没有关闭前,不一定写到文件。
pulbic voidclose() throws IOException:关闭此输出流并释放与此流有关的所有系统资源(含刷新操作)。
Wiriter:继承此类的都是输出字符流,且字符的单位是字符(16位)。
public voidwrite(int c) throws IOException
写入单个字符
public voidwrite(char[] cbuf) throws IOException
写入字符数组
public voidwrite(String str) throws IOException:写出字符串到关联的数据源中去
public abstractvoid close() throws IOException:关闭此流,但要先刷新它
public abstract voidflush() throws IOException:刷新该流的缓冲,将缓冲的数据全写到目的地。
Reader:继承此类的流大多是输入字符流。单位是字符。
常用的方法:
abstract int read(char[] buf, int offset, int count):读取指定字符偏移量offset最多count个到buf的字符数组中。
I/O流之节点流
节点流分为文件流、内存流、管道流。
文件流主要用来操作文件,主要以FileXxx的类,是文件流。比如FileInputStream、FileOutputStream、FileReader、FileWriter。
内存流主要用来操作内存的。ByteArrayInputStream 和 ByteArrayOutputStream 。
处理流又称过滤流。缓冲流:提高数据流的读写效率。
节点流又分为文件流和内存流。
文件流主要类有FileInputStream,FileOutputStream,FileReader,FileWriter。
内存流主要用来操作内存,ByteArrayInputStream(内存输入流,主要完成将内容从内存读入程序之中)和ByteArrayOutputStream(内存输出流,主要是将数据写入到内存中)。ByteArrayOutputStream类中有一个方法toByteArray(),可以将刚写入到内存中的数据流,返回一个byte类型的字节数组。
处理流又称过滤流,大致可以分为缓冲流,Object流,打印流,转换流,数据流。
缓冲流是处理流的一种,建立在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,还增加了一些新的方法。相关的类有
1. BufferedInputStream 可以对任何的InputStream流进行包装。
2. BufferedOutputStream 可以对任何的OutputStream流进行包装。
3. BufferedReader 可以对任何的Reader流进行包装。新增了readLine()方法用于一次读取一行字符串(以‘\r’或‘\n’认为一行结束)返回一行如果没有返回null。
4. BufferedWriter 可以对任何的Writer流进行包装,新增了newLine()方法用于写入一个行分隔符。
对于缓冲输出流,写出的数据会先缓存在内存缓冲区中,关闭此流前要用flush()方法将缓存区的数据立刻写出。关闭过滤流时,会自动关闭过滤流所包装的所有底层流。
Object流(对象流):JDK提供的ObjectOutputStream 和ObjectInputStream 类是用于存储和读取基本数据类型或对象的过滤流。
1. 用ObjectOutputStream类保存基本数据类型或对象的机制叫序列化。
2. 用ObjectInputStream类读取基本数据类型或对象的机制叫反序列化。
能被序列化的对象所对应的类必须实现java.io.Serializable这个标识性接口
打印流:PrintStream和PrintWriter都属于输出流,分别针对字节和字符。PrintStream和PrintWriter类都提供了一系列重载的print和println方法来输出各种类型的数据。
转换流:在IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换流。转换流用于在字节流和字符流之间转换。
JDK提供了两种转换流:
A. InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。InputStreamReader需要和InputStream“套接”,它可以将字节流中读入的字节解码成字符。
B. OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。OutputStreamWriter需要和OutputStream“套接”,它可以将要写入字节流的字符编码成字节。
数据流:DataInputStream和DataOutputStream。要注意,读写字符串的方法readUTF()和writeUTF();
在众多的流操作中,各种流之间要结合使用,同时也要注意读取和写入效率,比如:在读取或者写入的文件较大时,就要考虑使用缓冲流;或者定义一个缓冲字节数组,提高流的操作效率。
还要注意,关闭流时,一定要考虑清楚,因为,关闭高级流会把相关的第一流关闭掉,这样再对流进行操作,会出现异常。流一旦关闭,则同一个流无法再开启。
本文出自 “JDK7环境的搭建” 博客,请务必保留此出处http://zzhhz.blog.51cto.com/7107920/1628960
原文地址:http://zzhhz.blog.51cto.com/7107920/1628960