序列化流与反序列化流,打印流,工具类commons-IO
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的更多相关文章
- android的Log日志打印管理工具类(一)
android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...
- java IO之 序列流 集合对象Properties 打印流 流对象
序列流 也称为合并流. SequenceInputStream 序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从 第一个输入 ...
- Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)
一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...
- Java基础知识强化之IO流笔记60:打印流 之 改进复制文本文件的案例
1. 使用打印流改进复制文本文件的案例 2. 代码示例: package cn.itcast_03; import java.io.BufferedReader; import java.io.Buf ...
- Java基础知识强化之IO流笔记59:打印流
1. 打印流 (1)分类: • 字节打印流 PrintStream • 字符打印流 PrintWriter (2)打印流的特点: • 只能写数据,不能读数据 • 只能操作目的地,不能操作数据源 ...
- Java常用工具类之IO流工具类
package com.wazn.learn.util; import java.io.Closeable; import java.io.IOException; /** * IO流工具类 * * ...
- JAVA学习第五十四课 — IO流(八)打印流 & 序列流
一.综合练习-文件清单列表 获取指定文件夹下,指定扩展名的文件(含子文件夹),并将这些文件的绝对路径写到一个文本文件里.也就是建立一个指定扩展名的文件列表 1.深度遍历 2.过滤器->容器 3. ...
- File类与常用IO流第十一章——打印流
第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...
- IO流_PrintWriter(字符打印流)与PrintStream(字节打印流)
PrintStream: 1.提供了打印方法可以对多种数据类型值进行打印,并保持数据的表示形式 2.它不抛IOException 3.构造函数接受三种类型的值: 字符串路径 File对象 ...
- Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)
一.流的操作规律 四个明确: 明确一:明确要操作的数据是数据源还是数据目的地 源:InputStream Reader 目的地:OutputStream Writer 先根据需求明确是要读还是写 ...
随机推荐
- 【Python】数组排序
1.numpy库:argsort() argsort函数返回的是数组值从小到大的索引值(升序排列) 一维: In [1]: import numpy as np In [2]: x = np.arra ...
- 【LeetCode】017. Letter Combinations of a Phone Number
题目: Given a digit string, return all possible letter combinations that the number could represent. A ...
- 关于Django ORM filter方法小结
django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...
- java面向对象的三大特性
1.面向对象的三大特性 继承.封装.多态 什么是继承? ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一. ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷. ③继承来的属性 ...
- JavaScript高级程序设计学习笔记第一章
作为学习javascript的小白,为了督促自己读书,写下自己在读书时的提炼的关键点. 第一章: 1.JavaScript简史:Netscape Navigator中的JavaScript与Inter ...
- 浏览器原生 form 表单POST 数据的两种方式
我们在提交表单的时候,form表单参数中会有一个enctype的参数.enctype指定了HTTP请求的Content-Type. 常用有两种:application/x-www-form-urlen ...
- java读取txt
java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...
- Deep Learning - Install the Development Environment
WLS(Windows Subsystem for Linux) Base WLS Installation Guide Initializing a newly installed distro W ...
- C#—反射(反射类型、方法、构造函数、属性、实现可配置可扩展、数据库访问类反射封装)
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使 ...
- 洛谷P1654 产品排序(sort)
P1654 产品排序(sort) 题目描述 有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的).现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及 ...