io流案列,目录拷贝 java高级知识部分
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(String filepath,String mode)
-
RandomAccessFile(File file,String mode)
其中mode包含四种模式:
-
r-以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
-
rw-打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
-
rws-读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
-
rwd-读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备
-
实现Serializable接口
-
实现Externalizable接口
完成对象序列化的过程必须包含以下步骤:
-
需要完成序列化的对象对应的类必须实现Serializable接口
-
通过对象输出流将对象存储到指定的输出源(文件,网络)中(通过ObjectOutputStream)
若需要将文件或者其他输入输出设备中的java对象读取出来,可以通过ObjectInputStream完成对象反序列化
实例:
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;
}
}
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);;
}
}