java.io操作是java基础中的基础,如果没有io操作程序都不会运行起来,所以,又回顾了一下java.io操作的内容,里面的对象序列化是J2EE的基础,是java中分布式部署和调用实现的基础,还有很有对文件系统、对网络资源的读写等等。
对于里面的个人觉的比较重要的知识做了一个图总结了一下。如下:
这里对于重点的理解和使用总结几点
1.概念理解
对于java.io的概念一直理解的有点偏差,首先这里面涉及到一个方向性的概念,即我们数据从哪里来到哪里去,在java.io操作中以及里面的很多概念和类的定义实现时,作者都是从内存的角度出发考虑的,比如你需要往电脑的硬盘上保存一些数据,那么你说是输入还是输出呢?其实这是输出操作,之所以你会觉的是输入操作因为你站在了自己的角度考虑,以为数据是自己写入到磁盘的,可实际上数据是通过内存往磁盘上写数据,对于内存来说这是输出操作
只有先正确理解了输入输出操作,才能正确选择何时的操作类来操作数据。
2.流操作
从一个文件写入另一个文件,如下
<pre name="code" class="java"> public static void main(String[] args) { try { //创建字节输入流 FileInputStream fis=new FileInputStream("F:\\歌曲\\Dreamcatcher.txt"); //创建字节输出流 FileOutputStream fos=new FileOutputStream("F:\\new.txt"); byte[] buf=new byte[64]; int hasRead=0; //循环从输入流里面取数据 while ((hasRead=fis.read(buf))>0) { //每次读取一次,往文件输出流里面写多少 fos.write(buf,0,hasRead); System.out.println(new String(buf,0,hasRead)); } System.out.println(new String(buf)); } catch (Exception e) { e.printStackTrace(); } }
3.对象序列化
所有可能在网络上传输的对象的类都应该是可序列化的,否则程序会出现异常,比如RMI远程方法调用,是JAVA EE的基础,过程中的参数和返回值;所有需要保存到磁盘里的对象类都必须可序列化,序列化底层实现是通过io流类来实现的。
序列化对象的版本号用途
有两个作用
其一,一个是反序列化多个对象时避免出现一个对象被序列化多多份
例如:
比如客户端有两个Teacher对象,引用同一个Student对象,在服务器端通过io反序列化时会接受到三个学生对象。
在序列化时对于引用类型的对象需要先序列化,这样在每次学历恶化Teacher对象时都会序列化Student对象,如果有了一个版本标识系统再实例化第二个Teacher对象时会先检测有没有Student对象,如果有将不再序列化。
其二,方便服务端升级,如果没有版本号每次编译类时系统都自动给类分配一个版本号,修改类结构之后前后两次会出现不一致现象,版本号避免。
总结;
对于IO操作顶层仅提供了几个抽象类,底层实现有十几个类通过装饰模式对底层一层一层封装,屏蔽底层数据处理的细节;IO操作为基础实现的对象序列化机制也是现在我们开发J2EE分布式应用的基础,它在整个java体系结构中处于底层,对于上面结构稳定很重要,经济基础决定上层建筑。