IO应该是平时项目里最常用到的功能了,无论是简单的文件读取,还是服务器端口监听,都会用到IO;但是,在面对Java IO包里庞杂的IO基础类库时,经常会很头大,是该选择InputStream
还是应该选择Reader
,应该为InputStream
增加一个Buffer
吗?如何根据应用场景选择合适的类库是摆在很多代码人员面前的一个难题,这里我将Java IO包里的常用类库做了一个梳理,包括它们的组织结构,功能特性,适用场景等,以方便后续使用时能方便快捷的根据需求选取最合适的IO类
根据解析图,从大的层面可以IO进行两个维度的划分:
数据类型,即:字符 or 字节,类上对应于Writer/Reader
or OutputStream/InputStream
操作类型,即:读取(输入) or 写入(输出),类上对应于Reader/InputStream
or Writer/OutputStream
Java IO的所有操作都无外乎这两种维度四大主类的扩展,大部分比较简单,下面对于稍微难理解以及值得注意的点进行单独说明
Java IO大量使用了Decorator模式,所以,一般在使用IO类库的时候都是采用Decorator的调用方式:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
在Java IO中,无论是字符的读与写还是字节的读与写,基本都是一一对应的,换句话说,有一个特定读的类,一般就会有一个特定写的类,把握这一点,可以起到化繁为简的作用,如FileInputStream
和FileOutputStream
就分别对应于文件的读和写;PipedInputStream
和PipedOutputStream
分别对应于管道数据的读和写
如何区分读 or 写,这是一个经常会困扰新手的问题,这里我提供一个简单的区分方式:以你当前运行的程序作为基准(即调用IO的程序),数据从程序传至其它地方则为写(输出),数据从其它地方传至程序则为读(输入);如将程序产生的数据存放至日志文件中,那么就是写,从端口中取得数据并在程序中进行处理,则是读
根据要执行的动作以及目标数据类型,同时结合使用场景选择合适的IO类进行组装,注意上面一句话其实涉及到三个步骤:
执行的动作,即是要读还是要写
数据类型,即是字节还是字符,有的时候还需要字符与字节的转换(如OutputStreamWriter
);如需要在网络上或内存里存储的数据,一般都是以字节的形式;又或者文件的写入,文本类的文件这种本身就是字符编码的一般是字符形式,而对于图片,视频等文件则只能使用字节的形式
使用场景,其实使用场景需要分两步考虑,首先考虑显而易见的场景,如是文件的操作还是字符串的操作,抑或是管道通信;其次需要考虑性能,如对文件的写操作是否会比较频繁,若是,则建议通过BufferedWriter对其进行封装,因为每次都对少量数据进行文件打开并写入是一个效率很低的方式
本文主要对基本的IO类做了简单的梳理,并就IO中的基本概念以及如何使用IO基础类库做了说明,当然,本文并未罗列所有的IO实现类,感兴趣的同学可以自己查看Java的文档或源码,同时本文也未如何自己定制IO类库,其实一般情况下Java提供的基础类库足以满足需求;另外Java在1.4后引入了NIO,即:No Blocking IO,它与原IO的使用场景有一定区别
Atas ialah kandungan terperinci Java中关于IO使用入门的简单介绍(图). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!