java读取apollo配置 java判断文件夹是否存在该文件( 四 )


Student stu =new Student("vitamin",20,1);File destFile = new File("destFile.txt");// 序列化对象到文件中ObjectOutputStream oos= null;try { FileOutputStream fos = new FileOutputStream(destFile);oos =new ObjectOutputStream(fos);oos.writeObject(stu);}catch(IOException ex) {}finally { try {oos.close();}catch(IOException ex) {}}// 反序列化文件中的流为对象ObjectInputStream ois= null;try { FileInputStream fis = new FileInputStream(destFile); ois =new ObjectInputStream(fis); Student newStu = (Student)ois.readObject(); System.out.println(newStu.toString());}catch(Exception ex) {}finally { try {ois.close();}catch(IOException ex) {}}// Student 类定义class Student implements Serializable{ private String Name; public int Age; public transient int Sex; public static String ClassName;private final static long serialVersionUID= -123123612836L;public Student(String name,int age,int sex) { this.Name =name; this.Age = age; this.Sex = sex; }@Override public String toString() { return String.format("Name=%s,Age=%d,Sex=%d", this.Name,this.Age,this.Sex); }}对象要想成功实现序列化和反序列化需要注意以下几点:
对象要想实现序列化 , 被序列化的对象要实现标记接口 Serializable 。无论属性访问权限如何 , 都可以进行序列化和反序列化 , 但静态属性无法被序列化和反序列化 。如果在对象序列化的过程中 , 不想让某个属性参与其中 , 可以使用关键字 transient 进行标记 。序列化到文件后是不要进行flush操作的 , 同字节流一样也不存在缓冲区 。如果对象在序列化后 , 对对象的属性的修改(比如访问属性的变更 , 字段类型的变更)都会导致在反序列后出现类似错误 :Student; local class incompatible: stream classdesc serialVersionUID = -123123612836, local class serialVersionUID = -1225000535040348600 这是由于对象在编译成class文件过程中会对属性生成一个 serialVersionUID  , 这个属性也会存储到序列化后的对象中 , 每次属性的变更都会导致它进行修改 , 如果出现前后不一致 , 则导致出现以上错误 。如果想避免这个问题 , 需要在对象内指定 serialVersionUID  , 具体数值什么都可以 。但是属性的定义一定要是 final static long 。反序列化后的对象是Object类型 , 不是Student 。如果需要使用Student对象的属性或方法 , 需要进行强制类型转化 。对象在序列化和反序列化的过程中 , 抛出的不只有IOException 。如果删除Student类定义或是Student.class文件 , 然后对序列化后的流调用toString()方法 System.out.println(ois.readObject()); ,就会抛出异常: java.lang.ClassNotFoundException: Student , 如果反序列化后的对象转为非Student对象 , 也会报其他的非IOException异常 。所以在处理异常的时候 , 需要考虑到这些情况 。Properties
在学习Java的过程中肯定会接触到用Map结构来存储Key/Value关系的数据 , 在我之前的博客 Java中关于泛型集合类存储的总结 中讲到过它的一个实现类 HashMap 。但是除了HashMap外还有一个实现类HashTable  , 它可以实现和HashMap一样的功能 , 但是由于是线程安全的(同步的)并且存储的对象是Object类型 , 这就导致它的性能对于线程不安全(非同步)HashMap会有所降低 , 所以不是很常用 。但是HashTable有一个子类 Properties 却很常用 , 它可以在文件中存储 Key=Value 形式的数据 , 可以用其来读取配置 。
Properties prop =new Properties();prop.setProperty("Name", "vitamin");prop.setProperty("Age", "20"); File file =new File("destFile.txt");FileWriter writer =new FileWriter(file);prop.store(writer, "this is a test conf"); // 存储到文件中并设置备注 , 如果备注是中文则会被转码 FileReader reader =new FileReader(file);prop.load(reader);System.out.println(prop.getProperty("Name")); // vitaminSystem.out.println(prop.getProperty("Sex")); // nullSystem.out.println(prop.getProperty(" Name")); // nullProperties虽然继承自HashTable , 但是它的Key和Value只能是String类型 , 然而实现内部仍然调用的是put(Object,Object)方法 。Properties是允许你直接调用put(Object,Object)方法的 , 毕竟都是Map的实现类 , 但是这样调用了之后 , 在运行时会报错并警告你只能设置String类型的数据 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: