从Java IO到JDK的使用

  入职一个月了,所在岗位并没有使用原来熟悉的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方法再来补充。

转载于:https://www.cnblogs.com/Liujialiang/p/7343827.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值