A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

三、限定程序运行次数
  1. package com.fjl;


  2. import java.io.*;
  3. import java.util.Properties;

  4. /**
  5. *
  6. *
  7. <span style="background-color: rgb(255, 255, 255); ">限定程序运行次数</span>
  8. **/
  9. public class  PrintDemo01{
  10.         public static void main(String[] args) throws IOException{
  11.                 File file = new File("config.txt");
  12.                 readConfigurationFile(file);
  13.                
  14.         }
  15.         /**
  16.          * 读取配置文件方法
  17.          * @param file 配置文件
  18.          * @throws IOException
  19.          */
  20.         public static void readConfigurationFile(File file) throws IOException{
  21.                 //取得Properties实例
  22.                 Properties prop = new Properties();

  23.                 if(!file.exists()){
  24.                         System.out.println("属性文件不存在");
  25.                         return;
  26.                 }
  27.                 //取得读取配置文件的输入流
  28.                 FileInputStream fis = new FileInputStream(file);

  29.                 //从输入流中读取属性文件列表
  30.                 prop.load(fis);
  31.                
  32.         //初始化运行次数
  33.                 int count = 0;
  34.                 String value = prop.getProperty("time");
  35.                
  36.                 if(value!=null)
  37.                 {
  38.                         //将字符串转化为int
  39.                         count = Integer.parseInt(value);
  40.                         if(count>=10)
  41.                         {
  42.                                 System.out.println("您好,使用次数已到,请输入激活码!!");
  43.                                 return ;
  44.                         }

  45.                 }

  46.                 System.out.println("这是软件运用内容!!");
  47.                 //改变运行次数
  48.                 count++;

  49.                 //将改变后的运行次数保存进属性文件
  50.                 prop.setProperty("time",count+"");

  51.                 FileOutputStream fos = new FileOutputStream(file);

  52.                 prop.store(fos,"");

  53.                 //关闭资源
  54.                 fos.close();
  55.                 fis.close();
  56.                
  57.         }
  58. }
复制代码
四、对象序列化
对象序列化就是把一个对象变成二进制数据的一种方法,通过对象序列化可以方便的实现对象的传输和存储。
如果一个类的对象想序列化,则该对象所在的类必须实现java.io.Serializable接口,该接口定义如下:
public interface Serializable{}
该接口没有定义任何方法,故该接口是一个标识接口,表示一个类具备了被序列化的能力。
如:
  1. <blockquote>package com.test;
复制代码
此Person类实现了Serializable接口,所以此类的对象可以进行二进制数据流进行传输的,而要实现对象的输入输出,还必须依靠对象的输入(ObjectInputStream)输出(ObjectOutputStream)流.对象的输出流输出序列化称为序列化,使用对象的输入流读入对象称为反序列化。
ObjectOutputStream类
对象输出流:
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants{}
常用方法
[size=-1] void
writeObject(Object obj)
          将指定的对象写入 ObjectOutputStream。
  1. package com.test;

  2. import java.io.File ;
  3. import java.io.FileOutputStream ;
  4. import java.io.OutputStream ;
  5. import java.io.ObjectOutputStream ;

  6. public class SerDemo01{//对象输出流
  7.         public static void main(String args[]) throws Exception {
  8.                 File f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
  9.                 ObjectOutputStream oos = null ;        // 声明对象输出流
  10.                 OutputStream out = new FileOutputStream(f) ;        // 文件输出流
  11.                 oos = new ObjectOutputStream(out) ;
  12.                 oos.writeObject(new Person("张三",30)) ;        // 保存对象
  13.                 oos.close() ;        // 关闭
  14.         }
  15. }
复制代码
结果


ObjectInputStream类
定义:
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants{}常用方法
[size=-1] Object
readObject()
          从 ObjectInputStream 读取对象。
  1. import java.io.File ;
  2. import java.io.FileInputStream ;
  3. import java.io.InputStream ;
  4. import java.io.ObjectInputStream ;
  5. public class SerDemo02{//对象输入流
  6.         public static void main(String args[]) throws Exception {
  7.                 File f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
  8.                 ObjectInputStream ois = null ;        // 声明对象输入流
  9.                 InputStream input = new FileInputStream(f) ;        // 文件输入流
  10.                 ois = new ObjectInputStream(input) ;        // 实例化对象输入流
  11.                 Object obj = ois.readObject() ;        // 读取对象
  12.                 ois.close() ;        // 关闭
  13.                 System.out.println(obj) ;//输出 张三 30
  14.         }
  15. };
复制代码
接口Externalizable实现Serializable接口的类的对象豆浆被序列化,如果需要自定义序列化内容,则可以实现Externalizable接口,该接口定义如下:
public interface Externalizable extends Serializable{  void writeExternal(ObjectOutput out) throws IOException
  void readExternal(ObjectInput in)  throws IOException,ClassNotFoundException;}
[size=-1] void
readExternal(ObjectInput in)
          对象实现 readExternal 方法来恢复其内容,它通过调用 DataInput 的方法来恢复其基础类型,调用 readObject 来恢复对象、字符串和数组。
[size=-1] void
writeExternal(ObjectOutput out)
          该对象可实现 writeExternal 方法来保存其内容,它可以通过调用 DataOutput 的方法来保存其基本值,或调用 ObjectOutput 的 writeObject 方法来保存对象、字符串和数组。

如果一个类实现Externalizable后必须存在一个无参构造函数,因为在反序列化时会默认调用无参构造实例化对象。
  1. package com.fjl;

  2. import java.io.Externalizable;
  3. import java.io.IOException;
  4. import java.io.ObjectInput;
  5. import java.io.ObjectOutput;

  6.         public class Person implements Externalizable{//实现
  7. Externalizable 接口
  8.        
  9.                 private String name ;        // 声明name属性
  10.                 private int age ;         // 声明age属性
  11.                 public Person(){} //无参构造
  12.                 public Person(String name,int age){        // 通过构造设置内容
  13.                         this.name = name ;
  14.                         this.age = age ;
  15.                 }
  16.                 public String toString(){        // 覆写toString()方法
  17.                         return "姓名:" + this.name + ";年龄:" + this.age ;
  18.                 }
  19.                 @Override
  20.                 public void writeExternal(ObjectOutput out) throws IOException {
  21.                         // TODO Auto-generated method stub
  22.                         out.writeObject(this.name);
  23.                         out.writeObject(this.age);
  24.                 }
  25.                 @Override
  26.                 public void readExternal(ObjectInput in) throws IOException,
  27.                                 ClassNotFoundException {
  28.                         // TODO Auto-generated method stub
  29.                         this.name=(String) in.readObject();
  30.                         this.age=in.readInt();
  31.                 }
  32. }
复制代码
序列化与反序列化
***
  1. import java.io.File ;
  2. import java.io.IOException ;
  3. import java.io.FileOutputStream ;
  4. import java.io.OutputStream ;
  5. import java.io.ObjectOutputStream ;
  6. import java.io.FileInputStream ;
  7. import java.io.InputStream ;
  8. import java.io.ObjectInputStream ;
  9. public class SerDemo03{
  10.         public static void main(String args[]) throws Exception{
  11.                 //ser() ;
  12.                 dser() ;
  13.         }
  14.         public static void ser() throws Exception {//序列化
  15.                 File f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
  16.                 ObjectOutputStream oos = null ;        // 声明对象输出流
  17.                 OutputStream out = new FileOutputStream(f) ;        // 文件输出流
  18.                 oos = new ObjectOutputStream(out) ;
  19.                 oos.writeObject(new Person("张三",30)) ;        // 保存对象
  20.                 oos.close() ;        // 关闭
  21.         }
  22.         public static void dser() throws Exception {//反序列化
  23.                 File f = new File("D:" + File.separator + "test.txt") ;        // 定义保存路径
  24.                 ObjectInputStream ois = null ;        // 声明对象输入流
  25.                 InputStream input = new FileInputStream(f) ;        // 文件输入流
  26.                 ois = new ObjectInputStream(input) ;        // 实例化对象输入流
  27.                 Object obj = ois.readObject() ;        // 读取对象
  28.                 ois.close() ;        // 关闭
  29.                 System.out.println(obj) ;
  30.         }
  31. };
复制代码
Externalizable 接口与Serializable接口的区别


在一般开发中,由于Serializable接口使用较方便,所以用的较多

transient关键字

实现Serializable 接口的类实际上是将一个对象中的属性全部序列化,如果希望一个对象的属性不被序列化,则用transient 关键字进行声明。
  1. package com.test;

  2. import java.io.Serializable ;
  3.         public class Person implements Serializable{
  4.                 /**
  5.                  *
  6.                  */
  7.                 private static final long serialVersionUID = 1L;
  8.                 private transient String name ;        // 声明name属性
  9.                 private int age ;         // 声明age属性
  10.                 public Person(String name,int age){        // 通过构造设置内容
  11.                         this.name = name ;
  12.                         this.age = age ;
  13.                 }
  14.                 public String toString(){        // 覆写toString()方法
  15.                         return "姓名:" + this.name + ";年龄:" + this.age ;
  16.                 }
  17. }
复制代码
保存再读取
  1. 反序列化与序列化代码在前面已经写了
复制代码
输出:null 30
















评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 辛苦了

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马