对象流
○ 序列化流:ObjectOutputStream
○ 反序列化流:ObjectInputStream
○ 特点:
■ 1、被序列化的对象必须实现Serializable接口
■ 2、序列化和反序列化的版本号 必须一致(内部不允许修改)。在实体类手动加入静态常量版本号,可以强制保持一致。public final static long serialVersionUID = 1L;
■ 3、ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量,不想被序列化的属性可以用transient修饰符修饰。密码不需要序列化。
● 创建一个实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Serializable {
public final static long serialVersionUID = 1L;
private Integer id;
private String name;
private transient String pwd;
}
实现序列化
public static void main(String[] args) {
Student s1 = new Student(0001,"张三","123456");
try (FileOutputStream stream = new FileOutputStream("../Student.txt");
ObjectOutputStream oos = new ObjectOutputStream(stream);
) {
oos.writeObject(s1);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
实现反序列化
public class ObjectStreamTest_02 {
public static void main(String[] args) {
try (FileInputStream stream = new FileInputStream("../Student.txt");
ObjectInputStream ois = new ObjectInputStream(stream);
){
Object o = ois.readObject();
System.out.println(o);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
2.酒店管理系统
关闭程序,序列化酒店包括所有的房间成文件
启动程序,反序列化酒店,把所有之前的信息读出来
面试题
● 你知道创建对象的方式?
○ 1、new构造方法
○ 2、反序列化
○ 3、反射
○ 4、clone()基本不用了
File
● 特点
○ File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。、
○ 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对 象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
○ File对象可以作为参数传递给流的构造器
● File的构造方法
○ public File(String pathname)以pathname为路径创建File对象,可以是绝对路径或者相对路径,
● 常用方法
○ getAbsolutePath 获取绝对路径
○ getParent 获取上层文件目录路径。若无,返回null
○ list 获取指定目录下的所有文件或者文件目录的名称数组
○ listFiles 获取指定目录下的所有文件或者文件目录的File数组
○ isDirectory 判断是否是文件目录
○ isFile 判断是否是文件
○ exists 判断是否存在
○ createNewFile :创建文件。若文件存在,则不创建,返回false
○ mkdir 创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。
○ mkdirs 创建文件目录。如果上层文件目录不存在,一并创建
○ delete 删除文件或者文件夹
public static void main(String[] args) {
// File.separator//动态提供分隔符
File f = new File("E:"+ File.separator+"javaLearnCode/javaSE/javaTest/src/main/java/zhy/practice/day22");
String absolutePath = f.getAbsolutePath();//获取绝对路径
System.out.println(absolutePath);
String path = f.getPath();//获取路径
System.out.println(path);
String name = f.getName();//获取文件名称
System.out.println(name);//day22
String parent = f.getParent();//获取上层文件目录路径,若无,返回null
System.out.println(parent);
long length = f.length();//获取文件长度(即:字节数)。不能获取目录的长度
System.out.println(length);
long l = f.lastModified();//获取最后一次修改时间
System.out.println(l);
Date date = new Date(l);
System.out.println(date);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = dateFormat.format(date);
System.out.println(format);
boolean b = f.isDirectory();//判断是否是文件目录
System.out.println(b);//true
boolean file1 = f.isFile();//判断是否是文件
System.out.println(file1);//false
boolean exists = f.exists();//判断是否存在
System.out.println(exists);//true
System.out.println("=================");
String[] list = f.list();
for (String s : list) {
System.out.println(s);
}
System.out.println("=+++++++++++++++++++++++++++");
File[] files = f.listFiles();
for (File file : files) {
System.out.println(file.getName());
}
System.out.println("=====================");
File f1 = new File("E:"+ File.separator+"javaLearnCode/javaSE/javaTest/src/main/java/zhy/practice/day22/b.txt");
f1.mkdir();//创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建,返回值为boolean类型
File f2 = new File("E:"+ File.separator+"javaLearnCode/javaSE/javaTest/src/main/java/zhy/practice/day22/b/c");
boolean mkdir = f2.mkdirs();//创建文件目录。如果上层文件目录不存在,一并创建,返回值为boolean类型
System.out.println(mkdir);
File f3 = new File("E:"+ File.separator+"javaLearnCode/javaSE/javaTest/src/main/java/zhy/practice/day22/c.txt");
try {
boolean newFile = f3.createNewFile();//创建文件。若文件存在,则不创建,返回false
System.out.println(newFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
f3.delete();//public boolean delete():删除文件或者文件夹,删除成功返回true
System.out.println("=========================");
}
递归复制
注意点:原路径和目标路径禁止重复
覆盖:立刻被清空
追加:边读边写,程序永远不会停止
package zhy.practice.day22.recursiveTest;
import java.io.*;
/**
* @author Mr.Wang
* @date 23-3-28
*/
public class RecursiveWork {
public static void main(String[] args) {
File file=new File("D:/测试目录");
recur(file);
}
public static void recur(File file){
if(file.isFile()){
// 复制
String absolutePath = file.getAbsolutePath();
// D:\测试目录\目录1\测试目录1.1\a
System.out.println(absolutePath);
String newPath="E"+absolutePath.substring(1);
File newFile=new File(newPath);
// String parent1 = newFile.getParent();
// File parent=new File(parent1);
File parentFile = newFile.getParentFile();
// if(!parentFile.exists()){
parentFile.mkdirs();
// }
try (FileInputStream fis=new FileInputStream(absolutePath);
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream(newPath);
BufferedOutputStream bos=new BufferedOutputStream(fos);
){
int read=0;
while ((read=bis.read())!=-1){
bos.write(read);
}
} catch (IOException e) {
e.printStackTrace();
}
}else{
File[] files = file.listFiles();
for (File eve:files) {
recur(eve);
}
}
}
}