引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,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. 2.5 Nginx服务器基础配置实例

    pay平台nginx配置文件详解 ###全局块###   user www www; #指定运行worker process 的用户和用户组 worker_processes 4; #指定Nginx开 ...

  2. mac 密码重置

    首先请开机或重新启动系统,在电脑刚启动时,请按下键盘上的 command+S 组合键不动, 接下来会在屏幕上看到一串串的命令字符显示,当进入安全模式以后,会看到 一个 root 开始的命令行输入端口. ...

  3. 微信小程序の页面路由

    微信小程序的页面路由由平台已栈的形式管理. 微信小程序的页面为什么会如此特殊呢,因为可视区域始终只有一个页面. 一.小程序页面的路由方式 小程序页面有6种路由方式:初始化.打开新页面.页面重定向.页面 ...

  4. ionic3 多级联动城市选择插件 ion-multi-picker

    1.效果演示 2.npm安装扩展包依赖  ion-multi-picker 组件 npm install ion-multi-picker --save 3.在app.module.ts中导入插件模块 ...

  5. cenos7 下数据库相关操作

    1.Linux Centos7下如何确认MySQL服务已经启动 https://www.cnblogs.com/qianzf/p/7082484.html 2.CentOS 7上安装MySQL并配置远 ...

  6. 2018-3-5-安装-pip

    title author date CreateTime categories 安装 pip lindexi 2018-3-5 19:4:4 +0800 2018-03-05 18:57:15 +08 ...

  7. Codeforces 348C Subset Sums 分块思想

    题意思路:https://www.cnblogs.com/jianrenfang/p/6502858.html 第一次见这种思路,对于集合大小分为两种类型,一种是重集合,一种是轻集合,对于重集合,我们 ...

  8. SpringCloud---分布式服务跟踪---Spring Cloud Sleuth

    1.概述 1.1 为什么要用到服务跟踪? 随着业务的发展,系统规模也会变得越来越大,各服务之间的调用关系也变得越来越错综复杂: 通常一个由客户端发起的请求   在后端系统中会经过多个不同的微服务调用  ...

  9. React 组件间传值

    壹  .了解React传值的数据 一. 创建组件的方法 一 . 1  通过function声明的组件特点是: 1)function创建的组件是没有state属性,而state属性决定它是不是有生命周期 ...

  10. Unity NGUI Download

    { 链接:https://pan.baidu.com/s/1hPf4brhN8RvcKP7HSwphHw  提取码:0iim }