java oop第12章_IO、序列化和反序列化
引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,Java针对文件系统的操作提供了一套规范,即IO,针对计算机内存而言,输入的称为输入流,输出的称为输出流。
一、 IO的分类:
- 从传递方向划分:输入流(InputXxx)、输出流(OutPutXxx)。
- 从数据格式划分:字节流(XxxStream)、字符流(XxxReader、XxxWriter)。
- 从数据中转的节点划分:节点流、过滤流
图源: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();
}
}
}
}
java oop第12章_IO、序列化和反序列化的更多相关文章
- Java IO详解(六)------序列化与反序列化(对象流)
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- 深入理解java虚拟机-第12章Java内存模型与线程
第12章 Java内存模型与线程 Java内存模型 主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ...
- 第一章 JacksonUtil 序列化与反序列化属性总结
1.json-lib与Jackson 关于json-lib与Jackson对比总结如下: 1).性能方面,Jackson的处理能力高出Json-lib10倍左右. 2).json-lib已经停止更新, ...
- Java对象表示方式1:序列化、反序列化和transient关键字的作用
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
- Java对象表示方式1:序列化、反序列化的作用
1.序列化是的作用和用途 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存 ...
- java 21 - 13 IO流之序列化和反序列化
序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.对象 -- 流数据(ObjectOutputStream) 构造方法:ObjectInputStream(InputStream in) ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java基础系列(八)序列化与反序列化
先来看两个例子 示例一:将对象保存成字节数组,再把对象的字节数组还原为对象 示例中用到的Bean package com.huawei.beans; import java.io.Serializab ...
- Java下用Jackson进行JSON序列化和反序列化(转)
Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...
随机推荐
- webpack3.X的学习
文章说明,这篇主要是记录一下我学习的过程.以代码为主.一些概念啊,插件的用途说明啊不做任何说明.有任何不明白的请参照webpack中文官网https://doc.webpack-china.org/. ...
- GCD 与XOR
题目:UVA12716 题意: 问 gcd(i,j) = i ^ j 的对数(j <=i <= N ) N的范围为30000000,有10000组样例 分析: 有几个结论:(1)若 a ...
- 【教程】CentOS 7安装 最新版本Docker
博主最近需要安装Docker,步骤如下: Docker安装官方地址:https://docs.docker.com/install/linux/docker-ce/centos/ 以下命令都是在roo ...
- celery中配置redis密码时的ValueError: invalid literal for int() with base 10: 'xxxx'
原配置: celery_broker = 'redis://:xxxx#xxxx@172.17.0.1:6379/0' # docker0 错误原因: 密码中不能有 # ? 等特殊字符 (无语O__O ...
- gradle笔记
gradle笔记 一.基础知识 1.1.groovy语言 Groovy适用于Java虚拟机的一种敏捷的动态语言,他是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言,使用该 ...
- mysql 使用 insert ignore into和unique实现不插入重复数据功能
执行插入操作,如果数据库中不存在才插入,否则就不插入 首先需要通过unique指定唯一约束字段 然后写sql语句的时候就写 insert ignore into () valuse () 这样就能实 ...
- ECMAScript6 Promise
Promise在Javascript中早就已经实现,在ECMAScript6中正式加入到标准.那么Promise到底是干什么的?怎么用? 一.Promise介绍 Promise是一个对象,用来传递异步 ...
- SpringDataRedis依赖
<dependencies> <dependency> <groupId>junit</groupId> ...
- Android中的onWindowFocusChanged()方法详解
Android中获取手机屏幕的高度和宽度,我们知道在onCreate方法中获取到的值都是为0的,有人说可以在onClick方法中获取值,这个也是个方法 ,但在onWindowFocusChanged方 ...
- cf期望概率专题
cf1009E:求到第i段期望和的比较困难,但是单独求每段的期望是比较容易的,所以单独对每段求和,然后累计总和 E[i]=1/2*a1+1/4*a2+...+1/2^(i-1)*ai-1+1/2^(i ...