您的位置:首页 > 编程语言 > Java开发

JAVA基础—IO体系分析

2015-06-22 23:41 615 查看
一.理论准备

流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行,设备可以是文件、网络、内存等。流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序(小马哥说的是机器)为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流,可以将流想象成一个“水流管道”(很多资料都这么讲的),自然就出现了方向的概念。

流把I/O设备内部的具体操作给隐藏起来了。所有InputStream和Reader的派生类都有一个基本的,继承下来的,能读取单个或byte数组的read( )方法。

Java分为字节流(Stream结尾)和字符流(Reader、Write结尾),再分为输入流(InputStream、Reader)和输出流(OutputStream、Write),输入输出相对于内存而言。在读字符的时候用字符流,如文本文件、XML(我想xml明明是字母字符组成的,属于ASCII文件,为何不用stream读取呢?)等。在读二进制文件时候用字节流,如RAR、EXE等不是文本以外的文件(图片)。Buffered开头的流只是加了缓冲区,为了读写提高效率。字符流不能直接输出,需要转换成字节流才能输出!

继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit),如图,深色的为节点流,浅色的为处理流。



继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图,深色的为节点流,浅色的为处理流。



二.用法分析

Java IO的一般使用原则(部分来自百度文库):

(1) 按数据来源(去向)分类:

是文件: FileInputStream, FileOutputStream, FileReader, FileWriter

是byte[]:ByteArrayInputStream, ByteArrayOutputStream

是Char[]: CharArrayReader, CharArrayWriter

是String: StringBufferInputStream, StringReader, StringWriter

网络数据流:InputStream, OutputStream, Reader, Writer

(2) 按是否格式化输出分:

要格式化输出:PrintStream, PrintWriter

(3) 按是否要缓冲分:

要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter。

(4) 按数据格式分:

二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类

纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类

(5) 按输入输出分:

输入:Reader, InputStream类型的子类;输出:Writer, OutputStream类型的子类

(6) 特殊需要:

从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter

对象输入输出:ObjectInputStream, ObjectOutputStream

进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

合并输入:SequenceInputStream

更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

(7) 决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

考虑最原始的数据格式是什么:是否为文本?是输入还是输出?是否需要转换流:InputStreamReader, OutputStreamWriter?数据来源(去向)是什么:文件?内存?网络?是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)是否要格式化输出:print。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: