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

  • 相关阅读:
    qs.parse()、qs.stringify() 、JSON.stringify()以及JSON.parse()的区别
    Vue设置button的disable属性
    vue-preview用法详解
    解决MUI不支持js严格模式环境下使用的问题
    Vue.js的keep-alive用法
    详解在webpack中使用axios
    详解VS2012发布web api流程
    解决Python2中文ascii编码的方法
    防火墙问题 Linux系统 /etc/sysconfig/路径下无iptables文件
    本机连接虚拟机中docker启动的mysql数据库
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978501.html
Copyright © 2011-2022 走看看