引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,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();
}
}
}
}

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

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

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

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

    第12章 Java内存模型与线程 Java内存模型  主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ...

  3. 第一章 JacksonUtil 序列化与反序列化属性总结

    1.json-lib与Jackson 关于json-lib与Jackson对比总结如下: 1).性能方面,Jackson的处理能力高出Json-lib10倍左右. 2).json-lib已经停止更新, ...

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

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  5. Java对象表示方式1:序列化、反序列化的作用

    1.序列化是的作用和用途 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存 ...

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

    序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.对象 -- 流数据(ObjectOutputStream) 构造方法:ObjectInputStream(InputStream in) ...

  7. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  8. Java基础系列(八)序列化与反序列化

    先来看两个例子 示例一:将对象保存成字节数组,再把对象的字节数组还原为对象 示例中用到的Bean package com.huawei.beans; import java.io.Serializab ...

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

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

随机推荐

  1. 微信公众号开发笔记-验证token

    开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...

  2. 使用Emacs来编程

    使用Emacs来编程 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} code ...

  3. [ACM] POJ 1218 THE DRUNK JAILER (关灯问题)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sr19930829/article/details/37727417 THE DRUNK JAILE ...

  4. bootstrap学习(四)表格

    基础样式: 自适应沾满浏览器 <table class="table"> <tr> <th>序号</th> <th>姓名 ...

  5. bootstrap学习(五)代码

    内联代码: <code>public static</code>void main 用户输入: to edit setting,press <kbd><kbd ...

  6. 解决 使用migrations 执行update-database 出现System.InvalidOperationException: 实例失败的问题

    好久没有使用Code First的方式来创建模型了  今天重温了一下 但是出现了很多问题 现在总结一下 在我做完初期的操作的之后,使用 update-database -verbose 更新数据库时, ...

  7. Spring Cloud服务保护

    微服务虽然解决了传统单体式应用各个模块之间强耦合的缺点,但同时也引出了新问题,由于微服务各个服务之间是独立部署的,并且一般情况下一个服务往往会依赖多个其他服务,并且服务之间的调用更多的是依赖不稳定的网 ...

  8. 开机流程 模块管理 Loader

    主机系统开机流程 boot loader 主要功能 显示核心模块加载信息 查询模块信息 核心模块的加载与移除 boot loader 的两个 stage grup2配置文件  /boot/grub2/ ...

  9. SQL server 数据库镜像删除如何操作

    安全性 Permissions 需要对数据库拥有 ALTER 权限. 使用 SQL Server Management Studio 删除数据库镜像 在数据库镜像会话期间,连接到主体服务器实例,然后在 ...

  10. SharpZipLib 文件/文件夹 过滤

    这里就不说压缩/解压了.网上教程太多. 主要说一下,解压时,如何过滤某些文件/文件夹 参考地址:https://github.com/icsharpcode/SharpZipLib/wiki/Fast ...