1序列化流与反序列化流

用于从流中读取对象的操作流 ObjectInputStream    称为 反序列化流

用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流

特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

1.1对象序列化流ObjectOutputStream

例:

import java.io.Serializable;

public class Person implements Serializable{
private String name;
private int age; public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
method01();
} // 序列化
public static void method01() throws IOException {
Person p = new Person("zhangsan", 18);
// 明确目的地
FileOutputStream fos = new FileOutputStream("E:\\zyx\\java\\Person.txt");
// 创建序列化流
ObjectOutputStream oos = new ObjectOutputStream(fos); // 会自动关闭fos
// 向文件中写入对象
oos.writeObject(p);
oos.close();
}
}

1.2序列化接口

如果类都可以序列化,不安全。所以必须实现接口,才允许序列化:

标记型接口,没有方法,不用重写,没有实际意义。

加上后再运行:

1.3对象反序列化流ObjectInputStream

例:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
method02();
} // 序列化
public static void method01() throws IOException {
Person p = new Person("zhangsan", 18);
// 明确目的地
FileOutputStream fos = new FileOutputStream("E:\\zyx\\java\\Person.txt");
// 创建序列化流
ObjectOutputStream oos = new ObjectOutputStream(fos); // 会自动关闭fos
// 向文件中写入对象
oos.writeObject(p);
oos.close();
} // 反序列化
public static void method02() throws ClassNotFoundException, IOException {
// 明确数据源
FileInputStream fis = new FileInputStream("E:\\zyx\\java\\Person.txt");
// 创建反序列化流
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
Person p = (Person) obj; // 强转
System.out.println(p);
ois.close();
}
}

说明:

1)readObject();返回值类型是Object

所以用Object接收,再强转

2)ClassNotFoundException这个异常

如果bin中的Person.class丢失,那么就会报这个异常

如果把age加上static

执行method01(),再执行method02(),

这说明序列化和反序列化的只是对象,静态后的属性因为不属于对象了,所以不会被序列化。

还可以加上瞬态关键字transient

1.4瞬态关键字transient

执行method01(),再执行method02(),

1.5序列版本号

把Person任意改一下,直接反序列化:

结果为:序列化冲突异常

图说明:

所以序列化后不要再改动Person了。

解决办法:给Person加一个序列化号:(可以直接点出来)

这个long值可以任意改,

加上后,再序列化,然后修改Person,再反序列化,就不会报异常了。

2打印流

只是输出流

根据流的分类:

字节打印流 PrintStream

字符打印流 PrintWriter

方法:

void print(String str): 输出任意类型的数据,

void println(String str): 输出任意类型的数据,自动写入换行操作

可以用write方法,但是走码表,而这两个是原样输出

2.1PrintStream

例:

import java.io.IOException;
import java.io.PrintStream; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
PrintStream ps=new PrintStream("E:\\zyx\\java\\print.txt");
ps.print(100);
ps.println("你好");
ps.println("换行");
ps.write(100);
ps.close();
}
}

说明:

print()原样输出

println()可以换行

write()走码表

2.2续写

传一个FileOutputStream对象:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\print.txt",true);
PrintStream ps=new PrintStream(fos);
ps.print(100);
ps.println("你好");
ps.println("换行");
ps.write(100);
ps.close();
}
}

2.3 PrintWriter

例:

import java.io.IOException;
import java.io.PrintWriter; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
PrintWriter pw=new PrintWriter("E:\\zyx\\java\\print.txt");
pw.println("你好");
pw.println("java");
pw.flush();
pw.close();
}
}

2.4自动刷新

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 字节输出流明确目的地
FileOutputStream fos = new FileOutputStream("E:\\zyx\\java\\print.txt");
// 创建自动刷新的字符打印流
PrintWriter pw = new PrintWriter(fos, true);
pw.println("你好");
pw.println("java");
pw.close();
}
}

2.5复制

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; public class CopyTest {
public static void main(String[] args) throws IOException {
copy();
} public static void copy() throws IOException{
//明确数据源
FileReader fr=new FileReader("E:\\zyx\\java\\print.txt");
BufferedReader br=new BufferedReader(fr);
//明确目的地
FileWriter fw=new FileWriter("E:\\zyx\\java\\a\\print.txt");
PrintWriter pw=new PrintWriter(fw,true); //自动刷新
String line="";
while((line=br.readLine())!=null){
pw.println(line);
}
br.close();
pw.close();
}
}

用打印流复制不用刷新和换行了

打印流总结:

1)只有输出目的地

2)不会抛IO异常

3 工具类commons-IO

3.1导入classpath

加入classpath的第三方jar包内的class文件才能在项目中使用

创建lib文件夹

将commons-io.jar拷贝到lib文件夹

右键点击commons-io.jar,Build Path→Add to Build Path

3.2 FilenameUtils

用来处理文件名的,可以轻松解决不同操作系统文件名称规范不同的问题

常用方法:

1)getExtension(String path):获取文件的扩展名;

2)getName(String filename):获取文件名;

3)isExtension(String fileName,String ext):判断fileName是否是ext后缀名;

例:

import java.io.IOException;
import org.apache.commons.io.FilenameUtils; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 获取文件扩展名
String ext = FilenameUtils.getExtension("E:\\zyx\\java\\demo.txt");
System.out.println(ext);
// 获取文件名
String filename = FilenameUtils.getName("E:\\zyx\\java\\demo.txt");
System.out.println(filename);
// 判断是否是java文件
boolean flag = FilenameUtils.isExtension("E:\\zyx\\java\\demo.txt", "java");
System.out.println(flag);
}
}

3.3 FileUtils

常用方法:

1)readFileToString(File file):读取文件内容,并返回一个String;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
File file=new File("E:\\zyx\\java\\print.txt");
String content=FileUtils.readFileToString(file);
System.out.println(content);
}
}

2)writeStringToFile(File file,String content):将内容content写入到file中;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
File file=new File("E:\\zyx\\java\\print.txt");
FileUtils.writeStringToFile(file, "你好");
}
}

3)copyDirectoryToDirectory(File srcDir,File destDir); 文件夹复制

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 数据源
File file = new File("E:\\zyx\\java\\b");
// 目的地
File file2 = new File("E:\\zyx\\java\\e");
// 复制
FileUtils.copyDirectoryToDirectory(file, file2);
}
}

4)copyFile(File srcFile,File destFile); 文件复制

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils; public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 数据源
File file = new File("E:\\zyx\\java\\eclipse.zip");
// 目的地
File file2 = new File("E:\\zyx\\java\\f\\eclipse.zip");
// 复制
long start=System.currentTimeMillis();
FileUtils.copyFile(file, file2);
long end=System.currentTimeMillis();
System.out.println(end-start);
}
}

练习:用常规方法复制文件夹(及文件)

序列化流与反序列化流,打印流,工具类commons-IO的更多相关文章

  1. android的Log日志打印管理工具类(一)

    android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...

  2. java IO之 序列流 集合对象Properties 打印流 流对象

    序列流 也称为合并流. SequenceInputStream 序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从 第一个输入 ...

  3. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  4. Java基础知识强化之IO流笔记60:打印流 之 改进复制文本文件的案例

    1. 使用打印流改进复制文本文件的案例 2. 代码示例: package cn.itcast_03; import java.io.BufferedReader; import java.io.Buf ...

  5. Java基础知识强化之IO流笔记59:打印流

    1. 打印流 (1)分类: • 字节打印流   PrintStream • 字符打印流   PrintWriter (2)打印流的特点: • 只能写数据,不能读数据 • 只能操作目的地,不能操作数据源 ...

  6. Java常用工具类之IO流工具类

    package com.wazn.learn.util; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * ...

  7. JAVA学习第五十四课 — IO流(八)打印流 & 序列流

    一.综合练习-文件清单列表 获取指定文件夹下,指定扩展名的文件(含子文件夹),并将这些文件的绝对路径写到一个文本文件里.也就是建立一个指定扩展名的文件列表 1.深度遍历 2.过滤器->容器 3. ...

  8. File类与常用IO流第十一章——打印流

    第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...

  9. IO流_PrintWriter(字符打印流)与PrintStream(字节打印流)

    PrintStream:  1.提供了打印方法可以对多种数据类型值进行打印,并保持数据的表示形式  2.它不抛IOException  3.构造函数接受三种类型的值:  字符串路径  File对象   ...

  10. Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)

    一.流的操作规律 四个明确: 明确一:明确要操作的数据是数据源还是数据目的地 源:InputStream   Reader 目的地:OutputStream Writer 先根据需求明确是要读还是写 ...

随机推荐

  1. python基础知识-列表,元组,字典

    列表(list) 赋值方法: l = [11,45,67,34,89,23] l = list() 列表的方法: #!/usr/bin/env python class list(object): & ...

  2. 《精通Spring4.X企业应用开发实战》读后感第三章

  3. Coding-Job:从研发到生产的容器化融合实践

    大家好,我是来自 CODING 的全栈开发工程师,我有幸在 CODING 参与了 Coding-Job 这个容器化的编排平台的研发.大家对 CODING 可能比较了解, Coding.net 是一个一 ...

  4. 网络爬虫之Xpath用法汇总

    众所周知,在设计爬虫时,最麻烦的一步就是对网页元素进行分析,目前流行的网页元素获取的工具有BeautifulSoup,lxml等,而据我使用的体验而言,Scrapy的元素选择器Xpath(结合正则表达 ...

  5. utunbu下的codeblocks配置openGL环境

    真想骂娘阿,刚开始用utunbu,什么也不明白,不明白我装都软件都在哪里,不知道就像windows下的系统文件那样的文件在哪里,也不知道如何配置环境变量.就这样稀里糊涂的,还要抓紧时间装openGL, ...

  6. 基于zookeeper实现分布式配置中心(一)

    最近在学习zookeeper,发现zk真的是一个优秀的中间件.在分布式环境下,可以高效解决数据管理问题.在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具.本文首先 ...

  7. 微信公众号授权登录,提示“redirect_uri 参数错误”

    做微信公众号开发授权登录的时候遇到的坑... 后台服务用node,index.js相关代码如下: const oauth = new OAuth(conf.appid, conf.appsecret) ...

  8. 洛谷P1655 小朋友的球(Stirling数)

    P1655 小朋友的球 题目描述 @发源于 小朋友最近特别喜欢球.有一天他脑子抽了,从口袋里拿出了N个不同的球,想把它们放到M个相同的盒子里,并且要求每个盒子中至少要有一个球,他好奇有几种放法,于是尝 ...

  9. 洛谷P1447 [NOI2010]能量采集(容斥)

    传送门 很明显题目要求的东西可以写成$\sum_{i=1}^{n}\sum_{j=1}^m gcd(i,j)*2-1$(一点都不明显) 如果直接枚举肯定爆炸 那么我们设$f[i]$表示存在公因数$i$ ...

  10. IT兄弟连 Java语法教程 变量1

    什么是变量 在Java程序中,变量是基本的存储单元.是在程序运行中值可以改变的一块内存区域.变量是通过标识符(变量名).变量类型及可选的初始化器来定义的,此外,所有的变量都有作用域,作用域定义了变量的 ...