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中实现对象序列化通常包含两种方式:
-
实现Serializable接口
-
实现Externalizable接口
完成对象序列化的过程必须包含以下步骤:
-
需要完成序列化的对象对应的类必须实现Serializable接口
-
通过对象输出流将对象存储到指定的输出源(文件,网络)中(通过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);; } }
作业
完成一个文件断点拷贝工具(当进行文件拷贝时,由于某些异常情况,比如断电,系统崩溃等,导致文件拷贝无法进行,当系统恢复,再次拷贝时,从上一次异常终止的位置继续完成拷贝,以减少重复拷贝,加快拷贝时间,推荐:RandomAccessFile)
基于文件存储(对象序列化)完成一个个人财务管理系统,其中包含账户类,收支类,类中包含属性如下:
账户类:(用户名,密码,昵称,账户余额)
收支类:(交易号,变动金额,收支类型,变更时间,所属账户,备注)
字段说明:交易号根据系统时间生成直接使用系统时间(精确到毫秒),收支类型(0:支出,1:收入),所属账户需要关联账户信息(一旦收支信息发生变化,所属账户余额随之变更),备注信息任意填写(如:买菜支出-支出,彩票中奖-收入)
要求完成如下功能:
1.开户(新增账户)
2.登录账户
3.新增交易(收入或支出)
4.查询指定账户一个月内交易记录,并显示一个月内总支出与总收入
5.计算指定账户收支比