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. 结合Django+celery二次开发定时周期任务

    需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还 ...

  2. poj3585树最大流——换根法

    题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...

  3. 用Entity Framework 来创建MySql数据库和表结构

    1. 创建VS工程 2.添加新项, 选中ADO.Net Entity Data Model模板 3.填入Host及数据库名字, 如果没有此数据库, 会提示创建 4.添加edmx后, 右击选择属性,配置 ...

  4. BLE Mesh网络协议综述

    0 引言 自2012年蓝牙4.0规范推出之后,全新的蓝牙低功耗(BLE)技术由于其极低的运行和待机功耗.低成本和跨厂商互操作性,3 ms低延迟.AES-128加密等诸多特色,可以用于计步器.心律监视器 ...

  5. js中变量声明提前

    demo1: var a=10; function b(){alert(a); var a=20; alert(a)} b()//undefined 20 因为:js编译器在执行b这个函数时,会把函数 ...

  6. [提高班] 2017 Summer Training Day1补题

    题目地址:https://vjudge.net/contest/175939#overview A.数据范围是10^9,所以需要一个巧思路.对于一个数n,如何去判定比它的所有数是否是二进制形式.比n小 ...

  7. codeblocks 汉字乱码

    网上有很多方法,不过目测是不同的机子和环境要用不同的设置来应对这种情况 电脑情况: win8 64-bit 装的是codeblocks v12.11 然后在我电脑上正确的配置是setting-edit ...

  8. HDU - 5001 Walk(概率dp+记忆化搜索)

    Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...

  9. HDU - 5878 2016青岛网络赛 I Count Two Three(打表+二分)

    I Count Two Three 31.1% 1000ms 32768K   I will show you the most popular board game in the Shanghai ...

  10. POJ - 2377 Bad Cowtractors Kru最大生成树

    Bad Cowtractors Bessie has been hired to build a cheap internet network among Farmer John's N (2 < ...