day18、对象流、file

对象流
○ 序列化流: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);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值