首页 > 代码库 > JAVA 基础 IO操作

JAVA 基础 IO操作

       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体系结构中处于底层,对于上面结构稳定很重要,经济基础决定上层建筑。

JAVA 基础 IO操作