java oop第12章_IO、序列化和反序列化

引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,Java针对文件系统的操作提供了一套规范,即IO,针对计算机内存而言,输入的称为输入流,输出的称为输出流。

一、      IO的分类:

  1.     从传递方向划分:输入流(InputXxx)、输出流(OutPutXxx)。
  2.     从数据格式划分:字节流(XxxStream)、字符流(XxxReader、XxxWriter)。
  3.     从数据中转的节点划分:节点流、过滤流

    图源:http://test.processon.com/view/555f1789e4b07c1520d3c24d#map

 

二、      字节流

是以二进制进行数据传递的IO流,它可以操作任何类型的文件,输入的字节流有一个顶层抽象类InputStream,实现类常用的有FileInputStream、ObjectInputStream。输出的字节流有一个顶层抽象类OutPutStream,实现类常用的有FileOutPutStream、ObjectOutputStream。

案例1:通过字节流完成文件的复制,文件可以是任何类型。

        InputStream inputStream = null;
    OutputStream outputStream = null;

    /**
     * 案例1:通过字节流完成文件的复制,文件可以是任何类型。
     *
     * @throws IOException
     * @throws Exception
     */
    @Test
    public void testCopyWithStream() throws IOException {
        // 创建一个输入的字节流,通过输入字节流读取文件
        inputStream = new FileInputStream("G:/Javatest/桌面壁纸.jpg");
        // 创建一个输出的字节流:将文件写出到目标位置
        outputStream = new FileOutputStream("G:/image.jpg");

        /**
         * 通过输入字节流,一边读取数据,再通过输出字节流一边写数据 read(byte []
         * b):表示可以读取输入字节流中的数据,并返回读取到的字节数,若返回-1则表示读取完成。
         * 为了提高读取效率,可以传入一个byte数组作为缓冲区,否则一次只能读取一个字节,效率太低
         */
        // 创建一个缓冲区
        byte[] buffer = new byte[2048];

        try {
            while (inputStream.read(buffer) != -1) {
                outputStream.write(buffer);
                System.out.println(buffer);
            }
            System.out.println("复制成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }

        }
    }    

三、      字符流

是以字符串进行数据传递,所以只能针对文本进行操作,输入的字符流有一个顶层抽象类Reader,常用的实现类有FileReader、BufferedReader。输出的字符流有一个顶层类Writer,常用的实现类有FileWriter、BufferedWriter。

案例2:通过字符流完成文件复制,只能是文本操作。

        InputStream inputStream = null;
    OutputStream outputStream = null;   

    /**
     * 案例2:通过字符流完成文件复制,只能是文本操作。
     */
    @Test
    public void testCopyWithChar() {
        Reader reader = null;
        BufferedReader bufferedReader = null;

        Writer writer = null;
        BufferedWriter bufferedWriter = null; 

        try {
            /**
             * 在Java中不管是文件名、路径、路径加文件名,通通都是用File类型表示
             */

            /*
             * //判断以上的路径是否不存在就把他创建出来
             * File file = File("G:/Javatest");
            if (!file.exists()) {
                file.mkdirs();
            }*/

            File file =  new File("G:/Javatest/java代码.txt");
            reader = new FileReader(file);
            bufferedReader = new BufferedReader(reader);
            writer = new FileWriter("G:/java.txt");
            bufferedWriter = new BufferedWriter(writer);
            /**
             * readLine():返回值是String,即读取到一行字符串
             * 若读取完成则返回null
             */
            String str;
            while((str = bufferedReader.readLine()) != null) {
                bufferedWriter.write(str + "\r\n");
                System.out.println(str);
            }
            System.out.println("复制完成");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
                if (writer != null) {
                    writer.close();
                }
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (reader != null) {
                    reader.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    } 

四、      序列化和反序列化:

一个类若实现了Serializable接口,表示该类可以被序列化和反序列化。

序列化:将该类的“对象”保存到外存的过程,若属性使用transient(瞬时、临时的)关键字修饰,表示该属性不需要序列化(持久化)。

反序列化:将保存了某个类的数据读取出来创建对象的过程。

package com.oop.ch12;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

import org.junit.Test;

import com.oop.entity.Grade;

/**
 * 练习序列化和反序列化的两个过程
 * @author zhangzimu
 *
 *Java中有4中创建对象的方式
 *
 */
public class SerializableTest {
    Grade grade = null;
    OutputStream outputStream = null;
    ObjectOutputStream objectOutputStream  = null;
    /**
     * 序列化:将该类的“对象”保存到外存的过程,若属性使用transient(瞬时、临时的)关键字修饰,表示该属性不需要序列化(持久化)。
     * 前提是类必须实现Serializable接口
     * @throws IOException
     */

    @Test
    public void test1(){

        try {
            grade = new Grade();
            grade.setGradeId(6);
            grade.setGradeName("六年级");

            outputStream = new FileOutputStream("G:/Javatest/grade.txt");
            objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(grade);
            System.out.println("序列化完成");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objectOutputStream != null) {
                    objectOutputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    /**
     * 反序列化:将保存了某个类的数据读取出来创建对象的过程。
     */
    @Test
    public void test2() {
        InputStream inputStream = null;
        ObjectInputStream objectInputStream = null;
        try {
            inputStream = new FileInputStream("G:/Javatest/grade.txt");
            objectInputStream = new ObjectInputStream(inputStream);
            Grade grade =  (Grade) objectInputStream.readObject();
            System.out.println("反序列化完成:" + grade);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (objectInputStream != null) {
                    objectInputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

原文地址:https://www.cnblogs.com/zhangzimuzjq/p/11793902.html

时间: 2024-10-28 04:38:27

java oop第12章_IO、序列化和反序列化的相关文章

Java IO详解(六)------序列化与反序列化(对象流)

File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html Java IO 字节输入输出流:http://www.cnblogs.com/ysocean/p/6854541.html Java IO 字符输入输出流:https://i.cnblogs.com/EditPosts.aspx?postid=6859242 Jav

深入理解java虚拟机-第12章Java内存模型与线程

第12章 Java内存模型与线程 Java内存模型  主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行. 内存间交互操作: 1 lock 作用于主内存的变量,它把一个变量标识为一个线程独占的状态. 2 unlock 作用于主内存的变量,把锁定的变量释放出来 3 read 作用于工作内存的变量,把一个变量的值从主内存传输到线程的工作内存中. 4 load 作用于工作

java 21 - 13 IO流之序列化和反序列化

序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.对象 -- 流数据(ObjectOutputStream) 构造方法:ObjectInputStream(InputStream in)  创建从指定 InputStream 读取的 ObjectInputStream 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象.流数据 -- 对象(ObjectInputStream) 构造方法:ObjectInputStream(InputStream in)  创建从指定

Java对象表示方式1:序列化、反序列化和transient关键字的作用

http://www.cnblogs.com/xrq730/p/4821958.html 平时我们在Java内存中的对象,是无 法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即 存储对象中的状态.一个Java对象的表示有各种各样的方式,Java本身也提供给了用户一种表示对象的方式,那就是序列化.换句话说,序列化只是表示对 象的一种方式而已.OK,有了序列化,那么必然有反序列化,我们先看一下序列化.反序

12.C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:  对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的

Java下用Jackson进行JSON序列化和反序列化(转)

Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的JSON操作方法. 一.准备工作 首先去官网下载Jackson工具包,下载地址http://wiki.fasterxml.com/JacksonDownload.Jackson有1.x系列和2.x系列,截止目前2.x系列的最新版本是2.9.0,2.x系列有3个jar包需要下载: jackson-cor

【BigData】Java基础_ObjectOutputStream与ObjectInputStream实现序列化与反序列化

1.概念 ObjectOutputStream用于序列化 ObjectOutputStream用于反序列化 所谓的序列化,其实就是将对象转化为二进制 举个例子说明: 例如,我在京东上买了一张木床,京东发货的时候,肯定不会给我发一张已经拼接好的木床,因为这样不方便运输,那么快递公司会将床先拆开,然后附上安装说明书,这就叫做序列化,等我拿到床的时候,我再把床按照说明书组装起来,这就叫做反序列化. 2.代码案例 2.1 简单对象的序列化与反序列化 文件1:User.java 一个存储用户信息的java

java oop第09章_JDBC02(CRUD操作)

第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应操作,本章讨论DAO中需要提供一些什么方法? 一.     Dao常用的方法 1.     增加的方法: 通常需要传入实体对象携带所有属性值,作为插入的数据:返回的是受影响的行数(int类型). 如:insertDept(Dept dept) 2.     删除的方法:通常需要传入id(指的是数据表

Java oop第08章_JDBC01(入门)

一. JDBC的概念: JDBC(Java Database Connectivity)java数据库链接,是SUN公司为了方便我们Java程序员使用Java程序操作各种数据库管理系统制定的一套标准(规范), 其中定义一些接口.抽象类和抽象方法,再由各个数据库管理系统厂商实现这些抽象方法,我们程序员只要学习一套JDBC规范就可以操作各种数据库管理系统. JDBC也是一个注册商标. 二. JDBC的入门案例/JDBC的开发流程: 1. 创建一个Java project/web project:JD