记录我的java之路——day15(周更)

day2-IO流(下)

  • 目录拷贝

  • RandomAccessFile

  • 对象序列化

目录拷贝

package com.softeem.example;
​
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
​
public class FileUtils {
​
    /**
     * 文件拷贝
     * @param source  源文件
     * @param dir 目标目录
     * @throws IOException 
     */
    public void fileCopy(File source,File dir) throws IOException{
        //根据目标目录结合源文件名构建新的目标File对象
        File target = new File(dir,source.getName());
        //获取源文件的输入流并包装
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));
        //获取目标文件的输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(target));
        //定义字节缓冲区
        byte[] b = new byte[1024];
        //记录每次读取的真实字节数
        int len = 0;
        while((len = bis.read(b)) != -1){
            bos.write(b, 0, len);
        }
        bos.close();
        bis.close();
    }
    
    /**
     * 完成目录拷贝
     * @param sourceDir 源目录
     * @param targetDir 目标目录
     * @throws IOException 
     */
    public void dirCopy(File sourceDir,File targetDir) throws IOException{
        targetDir = new File(targetDir,sourceDir.getName());
        if(!targetDir.exists()){
            //创建目录
            targetDir.mkdirs();
        }
        //读取源目录中的子文件
        File[] files = sourceDir.listFiles();
        if(files != null){
            for(File f:files){
                if(f.isFile()){
                    //拷贝文件
                    fileCopy(f, targetDir);
                }else{
                    //递归
                    dirCopy(f, targetDir);
                }
            }
        }
    }
    
    
    public static void main(String[] args) throws IOException {
        File dir1 = new File("d:/fileTest");
        File dir2 = new File("d:/targetFile");
        new FileUtils().dirCopy(dir1, dir2);
    }
}
​

RandomAccessFile类

对象序列化

对象序列化是一种用于在文件或者各种其他输入输出设备中存储java对象的机制,通过将实现过序列化结构的对象存储到指定的输出源,可以完整的保存对象数据;对象序列化机制一般常用于大型项目中的缓存技术,以缓存经常需要使用到的对象数据;java中实现对象序列化通常包含两种方式:

  1. 实现Serializable接口

  2. 实现Externalizable接口

完成对象序列化的过程必须包含以下步骤:

  1. 需要完成序列化的对象对应的类必须实现Serializable接口

  2. 通过对象输出流将对象存储到指定的输出源(文件,网络)中(通过ObjectOutputStream)

若需要将文件或者其他输入输出设备中的java对象读取出来,可以通过ObjectInputStream完成对象反序列化

示例代码:

Player.java

package com.softeem.seri;
​
import java.io.Serializable;
​
/**
 * 序列化:把一个java对象存储到文件或者其他输出源中   ObjectOutputStream
 * 反序列化:从文件或者其他输入源读取一个java对象 ObjectInputStream
 * @author mrchai
 *
 */
public class Player implements Serializable{
​
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String nickName;
    private int level;
    private int power;
    private int x;
    private int y;
    
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public int getLevel() {
        return level;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    public int getPower() {
        return power;
    }
    public void setPower(int power) {
        this.power = power;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}

Client.java

public class Client {
​
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        Player p = new Player();
        p.setNickName("嗜血狂魔");
        p.setLevel(23);
        p.setPower(56000);
        p.setX(289);
        p.setY(335);
        
//      //对象序列化
//      OutputStream os = new FileOutputStream("role.dat",true);
//      //获取基于文件对象的对象输出流
//      ObjectOutputStream oos  = new ObjectOutputStream(os);
//      oos.writeObject(p);
//      oos.close();
        
        //对象反序列化
        InputStream is = new FileInputStream("role.dat");
        ObjectInputStream ois = new ObjectInputStream(is);
        Object obj = ois.readObject();
        System.out.println(obj);;
        
    }
​
}
​

作业

  1. 完成一个文件断点拷贝工具(当进行文件拷贝时,由于某些异常情况,比如断电,系统崩溃等,导致文件拷贝无法进行,当系统恢复,再次拷贝时,从上一次异常终止的位置继续完成拷贝,以减少重复拷贝,加快拷贝时间,推荐:RandomAccessFile)

  2. 基于文件存储(对象序列化)完成一个个人财务管理系统,其中包含账户类,收支类,类中包含属性如下:

    账户类:(用户名,密码,昵称,账户余额)

    收支类:(交易号,变动金额,收支类型,变更时间,所属账户,备注)

    字段说明:交易号根据系统时间生成直接使用系统时间(精确到毫秒),收支类型(0:支出,1:收入),所属账户需要关联账户信息(一旦收支信息发生变化,所属账户余额随之变更),备注信息任意填写(如:买菜支出-支出,彩票中奖-收入)

    要求完成如下功能:

    • 1.开户(新增账户)

    • 2.登录账户

    • 3.新增交易(收入或支出)

    • 4.查询指定账户一个月内交易记录,并显示一个月内总支出与总收入

    • 5.计算指定账户收支比

猜你喜欢

转载自blog.csdn.net/qq_34304871/article/details/81274770