序列化流与反序列化流,打印流,工具类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 先根据需求明确是要读还是写 ...
随机推荐
- Cache系列:spring-cache简单三步快速应用ehcache3.x-jcache缓存(spring4.x)
前言:本项目基于spring4.x构建,使用ehcache3.5.2和JCache(jsr107规范) 一.依赖 除了ehcache和cache-api外,注意引用spring-context-sup ...
- bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 0/1分数规划裸题. #include<iostream> #includ ...
- 更换mysql数据目录后出现 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法
服务器上的mysql默认数据目录为/var/lib/mysql/,同时服务器的/空间不是很大,而近期又有大量的日志需要导入进行分析,时常搞得/的空间捉襟见肘,晚上一狠心就想把mysql的数据目录转移到 ...
- 乱写的一个SQL框架
闲来没事,看了mybatis的实现形式,就心血来潮的自己弄了一个仿照mybatis的框架,性能肯定不好,而且有很多问题,但是是一次有益的尝试 1.基本配置文件 <!--加载数据源--> & ...
- linux——boot空间不足
1. 先用df命令,查看磁盘分区情况 2. dpkg --get-selections|grep linux-image(查看更新了多少内核) root@ubuntu:/home/hadoop# dp ...
- Synchronized之二:synchronized的实现原理
Java提供了synchronized关键字来支持内在锁.Synchronized关键字可以放在方法的前面.对象的前面.类的前面. 当线程调用同步方法时,它自动获得这个方法所在对象的内在锁,并且方法返 ...
- 原生app与WebApp的区别
Native App开发Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是由 ...
- HDU 1532 Drainage Ditches (网络流)
A - Drainage Ditches Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)
B. 腾讯益智小游戏—矩形面积交(简单) 1000ms 262144K 腾讯游戏开发了一款全新的编程类益智小游戏,最新推出的一个小游戏题目是关于矩形面积交的.聪明的你能解出来吗?看下面的题目接招吧 ...
- std::function"函数"对象包装器
语义: 类模板std::function是可调用对象的包装器,可以包装除了类成员之外的所有可调用对象.包括,普通函数,函数指针,lambda,仿函数.通过指定的模板参数,它可以用统一的方式保存,并延迟 ...