0
点赞
收藏
分享

微信扫一扫

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作


笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_序列化

 

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_c#_02

 1.5.5 使用序列化克隆对象

可使用序列化的方式把对象写入流再读出的方式,进行深拷贝。(嗯。。。实际上我发现很多对象复制为另一个对象的框架都或多或少有点问题。后来干脆是把对象转json再转回来,当然苛求性能也可以直接写反射,json、序列化这个过程,肯定没有反射香,但优点就是简单,不容易错)。

原书作者示例:

SerialCloneTest.java

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

import com.dyy.jdk8.test.Employee;

public class SerialCloneTest {
public static void main(String[] args) {
Employee harry = new Employee("Harry Hacker", 35000, 1989, 10, 1);
Employee harry2 = (Employee) harry.clone();

harry.raiseSalary(10);

System.out.println(harry);
System.out.println(harry2);
System.out.println(harry==harry2);
}
}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

SerialCloneable.java

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

import java.io.*;
public class SerialCloneable implements Cloneable, Serializable {
public Object clone(){
try{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(this);
out.close();

ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream in = new ObjectInputStream(bin);
Object ret = in.readObject();
in.close();
return ret;
}catch (Exception e){
return null;
}

}

}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

Employee.java

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

import com.dyy.jdk8.io.SerialCloneable;

import java.util.Date;
import java.util.GregorianCalendar;

public class Employee extends SerialCloneable {
private String name;
private double salary;
private Date hireDay;

public static final int NAME_SIZE = 40;
public static final int RECORD_SIZE = 2*NAME_SIZE+20;
public Employee(){}

public Employee(String n, double s, int year, int month, int day){
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year,month-1, day);
hireDay = calendar.getTime();
}


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getSalary() {
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}

public Date getHireDay() {
return hireDay;
}

public void setHireDay(Date hireDay) {
this.hireDay = hireDay;
}

public void raiseSalary(double byPercent){
double raise = salary*byPercent/100;
salary+=raise;
}

@Override
public String toString() {
return getClass().getName() + "[name="+name+",salary="+salary+",hireDay="+hireDay+"]";

}

}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

运行结果:

最后加了一个对象比对,比较是不是同一个对象。结果为不是:

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_java_03

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_绝对路径_04

 1.6 文件管理

本地文件和文件夹,可使用 File 进行操作:

获取文件:File f = new File(path);,其中path用来表示绝对路径或者相对路径

判断存在:f.exist(),true存在, false不存在

创建文件夹:f.mkdir();

创建文件:f.createNewFile();

删除文件:f.delete();

判断是否是文件夹:f.isDirectory();

获取文件夹下所有文件:File[] files = f.listFiles();

作者示例(因为 .. 太多了,所以改成了 .)

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

import java.io.*;

public class FileDirectories {
public static void main(String[] args) {
if(args.length == 0)
args = new String[]{"."};//原版是 ..
try{
File pathName = new File(args[0]);
String[] fileNames = pathName.list();
for(int i = 0; i < fileNames.length; i++){
File f = new File(pathName.getPath(),fileNames[i]);

if(f.isDirectory()){
System.out.println(f.getCanonicalPath());
main(new String[]{f.getPath()});
}
}
//注释部分为我的写法
// File[] files = pathName.listFiles();
// for(File f:files){
// if(f.isDirectory()){
// System.out.println(f.getCanonicalPath());
// main(new String[]{f.getPath()});
// }
// }
}catch (IOException e){
e.printStackTrace();
}
}
}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

注释部分的写法结果与上方完全一致,目的就是打印出所有的文件标准路径

运行结果:

最后加了一个对象比对,比较是不是同一个对象。结果为不是:

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_c#_05

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

细节:

getCanonicalPath(),这东西从来没用过,它是干啥的呢?看看源码注释:

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_序列化_06

然后发现 canonical 这个单词,没学过,那就查词典:

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_绝对路径_07

大概这段是说,返回给出的抽象路径名的最简洁唯一的绝对路径。这个路径依赖于系统,调用过程,会先调用 getAbsolutePath,拿到绝对路径,然后把它映射到唯一的系统路径。典型的做法是把类似于 .或者 .. 这样的操作处理掉,成为标准路径。

不论文件是否存在,必然存在标准路径。创建、删除前后拿到的标准路径不一定一致。

简单的总结:

对于存在的路径,getAbsolutePath() 返回的可能不是最简洁的绝对路径,getCanonicalPath() 是的 getAbsolutePath() 化简版。

测试:

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
File f = new File("../a.txt");
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

运行结果:

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_绝对路径_08

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

公众号 钰娘娘知识汇总 

笔记 第1章 流与文件(10) 序列化克隆对象与文件系统操作_绝对路径_09


举报

相关推荐

0 条评论