IO
序列化,将对象存储到文件保存。
反序列化,将文件中的对象读取出来。
如果要一次序列化多个对象,咋整?
用一个ArrayList集合存储多个对象,然后直接对集合进行序列化即可。
注意:ArrayList集合已经实现了序列化接口。
代码演示:
java
public class ObjectOutputStreamDemo1 {
public static void main(String[] args) throws IOException {
//目标:完成对象的序列化,把Java对象存储到文件中去
//1、准备一个对象
Student s = new Student("风驴子",27,"mazi666",160);
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("day10-io-code/src/obj.txt"));
//3、开始写对象出去
oos.writeObject(s);
//4、关闭资源
oos.close();
}
}
public class ObjectInputStreamDemo2{
public static void main(String[] args) throws IOException, ClassNotFoundException {
//目标:对象反序列化,使用对象字节输入流管道把文件中的Java对象注入到内存中
//1、创建对象字节输入流管道
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10-io-code\\src\\obj.txt"));
//2、读取对象进来(对象反序列化)
Student s = (Student)ois.readObject();
System.out.println(s);
System.out.println(s.getAge());
ois.close();
}
}
13、IO框架
什么是框架?
- 解决某类问题,编写的一套类、接口等,可以理解为一个半成品,大多框架都是第三方研发的。
- 好处:在框架的基础上开发,可以得到优秀的软件架构,并能提高开发效率;
- 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去。
什么是IO框架?
- 封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。
步骤:导入commons-io-2.11.0.jar框架到项目中去。

Commons-io
- Commons-io是apache开源基金组织提供的一组有关IO操作的小框架,目的是提高IO流的开发效率;


14、复制文件夹
代码演示:
java
public static void copyDirectory(File srcDir,File destDir) throws IOException {
//1、可以先进行判断
if(srcDir == null || destDir == null || !srcDir.exists() || !destDir.exists() || srcDir.isFile() || destDir.isFile()){
return;
}
//2、开始拷贝之前,先在目标位置创建新文件夹名和源文件夹名称一样
File destNewDir = new File(destDir,srcDir.getName());
destNewDir.mkdirs();
//3、提取原始目录的一级文件对象
File[] files = srcDir.listFiles();
//4、判断这个目录下是否可以拿到一级文件对象,一级是否存在一级文件对象。
if(files == null || files.length == 0) return;
//5、遍历全部一级文件对象,拷贝到目录文件夹
for(File file : files){
if(file.isFile()){
//源文件:file
//目标文件:destNewDir + file.getName();
FileUtils.copyFile(file,new File(destNewDir,file.getName()));
}else{
copyDirectory(file,destNewDir);
}
}
}
15、删除文件夹
删除文件夹内的全部文件
java
public class DeleteDirDemo2 {
public static void main(String[] args) {
//目标:删除文件夹
}
public static void deleteDir(File dir){
//1、不删除的情况
if(dir == null || !dir.exists()) return;
//2、如果是文件直接删除
if(dir.isFile()) {
dir.delete();
return;
}
File[] files = dir.listFiles();
//3、判断是否有权限进行删除
if(files == null) return;
//4、如果是空文件价,则直接删除
if(files.length == 0){
dir.delete();
return;
}
//5、遍历全部一级文件对象,删除他们,再删除文件夹自己。
for(File file : files){
if(file.isFile()){
file.delete();
}else{
deleteDir(file);
}
}
dir.delete(); //删除自己
}
}
16、啤酒问题
1、特殊文件和日志概述
特殊文件:
- 存储有关系的数据,作为系统的配置文件;
- 作为信息进行传输。


这些特殊文件,我们主要学什么?
了解他们的特点、作用;学习使用程序读取它们里面的数据;学习使用程序把数据存储到这些文件里。
日志技术:
把程序运行的信息,记录到文件中,方便程序员定位bug、并了解程序的执行情况等。
2、Properties
属性文件Properties
- 都只能是键值对;
- 键不能重复
- 文件后缀一般是.properties结尾的

Propertise
- 是一个Map集合(键值对集合),但是我们一般不会当集合使用。
- 核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
使用Properties读取属性文件里的键值对数据


修改文件属性的编码:

代码演示:
java
public class PropertiesDemo1 {
public static void main(String[] args) throws IOException {
//目标:Properties读取属性文件中的键值对数据
//1、创建属性集对象,代表一个属性文件
Properties properties = new Properties();
System.out.println(properties);
//2、加载属性文件信息到属性集对象中去
InputStream input = new FileInputStream("day11-special-file-log-code\\src\\users.properties");
properties.load(input);
System.out.println(properties);
System.out.println(properties.get("赵敏"));
System.out.println(properties.getProperty("赵敏"));
System.out.println("--------------");
Set<String> keys = properties.stringPropertyNames();
for (String key : keys) {
System.out.println(key + "=" + properties.getProperty(key));
}
System.out.println("-----------");
properties.forEach((key, value) -> System.out.println(key + "=" + value));
}
}
使用Properties把键值对数据写出到属性文件里去

代码演示:
java
public class PropertiesDemo2 {
public static void main(String[] args) throws IOException {
//目标:掌握使用Properties将键值对数据写出去到属性文件中去
//1、创建属性集对象
Properties properties = new Properties();
properties.setProperty("admin","666666");
properties.setProperty("玄冥二老","wangfei");
properties.setProperty("金毛狮王","成昆");
properties.setProperty("小昭","wuji");
//2、存储到文件
properties.store(new FileOutputStream("day11-special-file-log-code\\src\\users2.properties"),"I saved many users! give me 100!");
}
}
3、案例
注意:属性文件的用法,也可以使用普通文件进行。读取普通文件内容,并进行数据处理。
需求:遍历属性文件中的内容,修改属性值的内容
java
public class PropertiesTest3 {
public static void main(String[] args) throws IOException {
//1、创建Properties对象
Properties properties = new Properties();
//2、加载属性文件中的键值对数据
properties.load(new FileReader("day11-special-file-log-code\\src\\people.txt"));
//3、判断是否存在李芳,存在把其值改为18
if(properties.containsKey("李芳")){
properties.setProperty("李芳","18");
}else{
System.out.println("没有此文件");
}
//4、拓展性文件对象,重新存入属性文件中去
properties.store(new FileWriter("day11-special-file-log-code\\src\\people.txt"),"give me 100 fen!");
}
}
4、xml的创建
XML(可扩展标记语言)
- 本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。
XML的特点
- XML中的"<标签名>"称为一个标签或一个元素,一版是成对出现的。
- XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
- XML中只能有一个根标签。
- XML中的标签可以有属性;
- 如果一个文件中放置的是XML格式的数据。这个文件就是XML文件,后缀一般要写成.xml。
XML的创建
- 就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml.
XML的语法规则

代码演示:
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!--以下是一个新的XML文件 -->
<user>
<user>
<name>张全蛋</name>
<sex>男</sex>
<age>32</age>
<hobby>炸鸡</hobby>
<sql>
select * from tb_student where age >= 18 && age <= 35
</sql>
</user>
<user id="2" desc="这是一个脱口秀演员">
<name>何广智</name>
<sex>男</sex>
<age>28</age>
<hobby>脱口秀</hobby>
<sql>
<![CDATA[
select * from tb_student where age >= 18;
]]>
</sql>
</user>
</user>
XML的作用和应用场景
- 本质是一种数据格式,可以存储复杂的数据结构,和数据关系;
- 应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。

5、dom4j解析XML
解析XML文件
- 使用程序读取XML文件中的数据

步骤:使用Dom4J解析出XML文件
需求:使用Dom4J把一个XML文件的数据进行解析
分析:
DOM4J解析XML文件的思想:文档对象模型

Dom4J解析XML-得到Document对象
- SAXReader:Dem4j提供的解析器,可以认为是代表整个Dom4j框架

- Document
