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 ...
随机推荐
- vue.js实现用户评论、登录、注册、及修改信息功能
vue.js实现用户评论.登录.注册.及修改信息功能:https://www.jb51.net/article/113799.htm
- php中mkdir()函数的权限问题(转)
问题描述: 使用以下php代码创建了一个目录,期望目录的权限是0777,实际结果是0755 mkdir('./aa/',0777); 分析与测试结果: 1.mkdir()函数指定的目录权限只能小于等于 ...
- HTMl中Meta标签和meta property=og标签含义
meta是head区的一个辅助性标签.其主要作用有:搜索引擎优化(SEO),定义页面使用语言,自动刷新并指向新的页面,实现网页转换时的动态效果,控制页面缓冲,网页定级评价,控制网页显示的窗口等! me ...
- Oracle中删表遇到ORA-14452
删表的时候碰到表忙的情况,会报错. DROP TABLE TMP_TAB_T_AGENT * ERROR at line 1: ORA-14452: attempt to create, alter ...
- 使用openntpd替换ntpd
系统自带的ntp服务太难用,systemd启动几次没启动起来,懒得折腾,换了openntpd一次成功.
- Codeforces 747F Igor and Interesting Numbers DP 组合数
题意:给你一个数n和t,问字母出现次数不超过t,第n小的16进制数是多少. 思路:容易联想到数位DP, 然而并不是...我们需要知道有多少位,在知道有多少位之后,用试填法找出答案.我们设dp[i][j ...
- docker提示没有开启转发解决方法
vim /usr/lib/sysctl.d/00-system.conf [root@t1 ~]# vim /usr/lib/sysctl.d/00-system.conf# Kernel sysc ...
- Jenkins使用admin修改安全矩阵的时候报错“admin没有Overall/Read权限”
1.注册完Jenkins,然后使用admin用户登录,报错“admin没有Overall/Read权限”: 2.因为我自己的Jenkins是放在tomcat/webapps的目录下的,所以Jenkin ...
- 关键字this super final static
this关键字 1.this代表通过当前类实例化成的对象. 2.通过this来获取当前类的属性和方法 3.通过this和区分成员变量和局部变量 4.通过this(参数),调用当前类的构造方法 注意:通 ...
- JQuery 浮动DIV显示提示信息并自动隐藏
/** * 浮动DIV定时显示提示信息,如操作成功, 失败等 * @param string tips (提示的内容) * @param int height 显示的信息距离浏览器顶部的高度 * @p ...