Java I/O 流的简单介绍及示例
什么是流
Java中多有的I/O都是通过流来实现的,可以将流理解为连接到数据目标或源的管道,可以通过连接到源的流从源当中读取数据,或通过连接到目标的流向目标写入数据。Java中的流很灵活,可以连接到各种不同的源或目标,例如磁盘文件、键盘、显示器、网络等。
流的分类
- 根据流的方向可以将其分为输入流和输出流
输入流是和源相连接,只能从输入流读取数据。
输出流是和目标相连接,只能向输出流写入数据。
源和目标可以简单地理解为数据的生产者和消费者。如下图:
-
根据流的躬耕层次的不同,流可以分为节点流(Node Streanms)和处理流(Processing Streams)
节点流一般用于直接用于直接从指定的位置进行读/写操作,例如磁盘文件、内存区域、网络连接等,其中一般只提供一些基本的读写操作方法,功能比较单一。
处理流往往用于对其他输入/输出流进行封装,对内容进行过滤处理,所以又称过滤流,一般提供了一些功能比较强大的读写方法。
鉴于节点流和处理流的特点,在实际应用中,通常是将节点流和处理流二者结合起来使用:节点流直接与指定的源或目标相连,而处理流则对节点流火其他处理流进一步进行封装,提供更丰富的输入/输出操作能力。如下图:
从上图可以看出,节点流更接近底层的数据,而处理流更接近实际操作的用户。在实际开发中通过将不同的节点流和处理流进行组合可以满足各种不同的输入/输出需求。
-
根据处理数据的类型不同,流可以分为字节流和字符流。
字节流以字节为基本单位来处理数据的输入/输出,一般都用于对二进制数据的读写,例如声音、图像等数据。
字符流以字符为基本单位来处理数据的输入/输出,一般对文本类型数据的读写,例如文本文件、网络中发送的文本信息等。虽然文本数据也可以看做二进制数据,但一般采用字符流处来处理效率更高,更方便。
Java I/O中字节流和字符流的祖先是以下4个抽象类:- InputStream:输入字节流 是所有输入字节流的祖先;
- OutputStream:输出字节流 所有输出字节流都派生自该类;
- Reader:输入字符流 所有输出字符流都派生自该类;
- Writer:输出字符流 是所有输出字符流的祖先;
从上面我们知道,InputStream和Reader是所有输入流的祖先,而OutputStream和Writer是所有输出流的祖先。对于不同的应用目的,从这4个类中又派生出很多使用的节点流和处理流子类。
节点流
处理流
一般前面是动词的都是处理流,前面是File的都是节点流。
I/O流的简单示例
package net.oseye; import java.io.*; public class IOTest { public static void main(String[] args) throws IOException { //处理流 BufferedWriter bw=null; //节点流 FileWriter fw=new FileWriter("out.txt"); //把节点流封装成处理流 bw=new BufferedWriter(fw); for(int i=0;i<20;i++){ bw.write("line "+i+"\r\n"); } bw.close(); //开始读取 BufferedReader br=null; FileReader fr=new FileReader("out.txt"); br=new BufferedReader(fr); String line=null; while((line=br.readLine())!=null){ System.out.println(line); } br.close(); } }
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。