标签:io流 cat 整理 nts style obj 图片 -- 方法
入职一个月了,所在岗位并没有使用原来熟悉的C/C++语言,一边工作一边学习Java。最近由于项目要求,经常使用Java中的读写操作,对此有些心得体会在此整理成文,文中主要的思路:首先介绍IO基本功能,然后介绍怎么根据功能需要,选择具体的IO操作。
一、Java IO常用的类图及其基本功能:
查看Java JDK可以发现IO包中包含了以下8个基类: (图片来源:http://www.falkhausen.de/Java-8/java.io/index.html)
图1 Java.IO包结构
其中:
1 InputStream和OutputStream是IO包的两个核心类(输入流与输出流),可以看作是带有一些属性的数据流,其作用是连接磁盘和程序:文件 <---> 流 <---> 程序。
图2 流的概念图
2 File 主要用于创建文件对象(读取,写入),是输入流、输出流的一种构造参数,告诉这些流读取和输出文件的路径。
3 Reader 和Writer 类提供了流的读取和写入方法,连接了字节流和字符流、Buffer流。可以实现从流中读取数据或者向流中写入数据。
4 ObjectStreams和Misc 用于实现流对象的序列化,Exceptions用于异常处理。
下面给出InputStream和OutputStream的UML类图,这两个图可能也不是很清楚,可以参考http://www.falkhausen.de/Java-8/java.io/index.html,这是一个展示Java JDK类图网站,对于总结知识点还是很好的
图3 InputStream
图4 OutputStream
从两大基类中衍生出不同的子类,每个子类负责一种类型的输入或输出,综合主要的子类特点,总结了其使用特点如下表:
二、根据项目需求选择IO操作:
IO的选择与使用,首先要明确使用的场合,要求。最近的工作中遇到一个压缩流问题,也是属于IO流的一种。要求是在解压和压缩的时候不落盘(数据量大),需要构建一种方法,输入参数为zip流(ZipInputStream),对数据流解析,生成对象的文件后,将新增文件写入zip流中。整理了一下解决问题的套路:
1 ZipInputStream是一种压缩输入流,其原始基类为InputStream,可以用这个流对象解压数据,这个没问题。
2 分析数据的结果怎么添加到zip流中呢?自然想到用它的兄弟ZipOutputStream,对数据进行压缩,而参考ZipOutputStream对象的构造方法为ZipOutputStream(OutputStream out)
,常见的是创建一个压缩文件对象输出流(网上教程基本都是这样的例子,需要指定压缩输出文件.zip),但这不符合需求
3 查看OutputStream这个基类的结构,如上图4,其子类包含FileOutputStream ByteArrayOutputStream FileterOutputStream等五个,其中FileOutputStream是常用的流对象,需要指定流的输出文件FileOutputStream(File file); 而查看ByteArrayOutputStream的实例化方法为ByteArrayOutputStream()
创建一个新的 byte 数组输出流。由此可以看出这个输出流对象是将数据保持到内存数组,而不是指定的磁盘文件,可以使用。因此有如下验证代码:将一个数据流压缩到内存数组中
public static byte[] zip(byte[] data) { byte[] b = null; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(bos); ZipEntry entry = new ZipEntry("zip"); entry.setSize(data.length); zip.putNextEntry(entry); zip.write(data); zip.closeEntry(); zip.close(); b = bos.toByteArray(); bos.close(); } catch (Exception ex) { ex.printStackTrace(); } return b; }
4 就是对整个过程进行方法整理,输入参数为ZipInputStream数据流,对其解压分析,将结果一起写入一个字节数组中,然后利用ZipOutputStream流对象对这个数组进行压缩,生成一个压缩字节数组
5 将压缩数组转换为新的ZipInputStream(转换过程类似上述分析过程,用到了InputStream的子类ByteArrayInputStream)
ByteArrayInputStream bis = new ByteArrayInputStream(data); ZipInputStream zip = new ZipInputStream(bis);
三、总结
因为初次接触Java,和很多人一样,在网上找各种样例,只知道依样画葫芦的去写,其实对每一个对象的构建,转换都不是很了解,结果试了很长时间,都没找到好的方法。即使最后偶然找到了解决方法,也浪费了很多时间精力。因此花了两天时间整理了以下Java IO的结构和部分使用方法,这样推广开来,
至少以后知道怎么使用Java JDK,遇到问题怎么去查找,暂时就到这里吧,以后遇到新的IO方法再来补充。
标签:io流 cat 整理 nts style obj 图片 -- 方法
原文地址:http://www.cnblogs.com/Liujialiang/p/7343827.html