三、限定程序运行次数- package com.fjl;
- import java.io.*;
- import java.util.Properties;
- /**
- *
- *
- <span style="background-color: rgb(255, 255, 255); ">限定程序运行次数</span>
- **/
- public class PrintDemo01{
- public static void main(String[] args) throws IOException{
- File file = new File("config.txt");
- readConfigurationFile(file);
-
- }
- /**
- * 读取配置文件方法
- * @param file 配置文件
- * @throws IOException
- */
- public static void readConfigurationFile(File file) throws IOException{
- //取得Properties实例
- Properties prop = new Properties();
- if(!file.exists()){
- System.out.println("属性文件不存在");
- return;
- }
- //取得读取配置文件的输入流
- FileInputStream fis = new FileInputStream(file);
- //从输入流中读取属性文件列表
- prop.load(fis);
-
- //初始化运行次数
- int count = 0;
- String value = prop.getProperty("time");
-
- if(value!=null)
- {
- //将字符串转化为int
- count = Integer.parseInt(value);
- if(count>=10)
- {
- System.out.println("您好,使用次数已到,请输入激活码!!");
- return ;
- }
- }
- System.out.println("这是软件运用内容!!");
- //改变运行次数
- count++;
- //将改变后的运行次数保存进属性文件
- prop.setProperty("time",count+"");
- FileOutputStream fos = new FileOutputStream(file);
- prop.store(fos,"");
- //关闭资源
- fos.close();
- fis.close();
-
- }
- }
复制代码 四、对象序列化
对象序列化就是把一个对象变成二进制数据的一种方法,通过对象序列化可以方便的实现对象的传输和存储。
如果一个类的对象想序列化,则该对象所在的类必须实现java.io.Serializable接口,该接口定义如下:
public interface Serializable{}
该接口没有定义任何方法,故该接口是一个标识接口,表示一个类具备了被序列化的能力。
如:- <blockquote>package com.test;
复制代码 此Person类实现了Serializable接口,所以此类的对象可以进行二进制数据流进行传输的,而要实现对象的输入输出,还必须依靠对象的输入(ObjectInputStream)输出(ObjectOutputStream)流.对象的输出流输出序列化称为序列化,使用对象的输入流读入对象称为反序列化。
ObjectOutputStream类
对象输出流:
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants{}
常用方法
- package com.test;
- import java.io.File ;
- import java.io.FileOutputStream ;
- import java.io.OutputStream ;
- import java.io.ObjectOutputStream ;
- public class SerDemo01{//对象输出流
- public static void main(String args[]) throws Exception {
- File f = new File("D:" + File.separator + "test.txt") ; // 定义保存路径
- ObjectOutputStream oos = null ; // 声明对象输出流
- OutputStream out = new FileOutputStream(f) ; // 文件输出流
- oos = new ObjectOutputStream(out) ;
- oos.writeObject(new Person("张三",30)) ; // 保存对象
- oos.close() ; // 关闭
- }
- }
复制代码 结果
ObjectInputStream类
定义:
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants{}常用方法
- import java.io.File ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.io.ObjectInputStream ;
- public class SerDemo02{//对象输入流
- public static void main(String args[]) throws Exception {
- File f = new File("D:" + File.separator + "test.txt") ; // 定义保存路径
- ObjectInputStream ois = null ; // 声明对象输入流
- InputStream input = new FileInputStream(f) ; // 文件输入流
- ois = new ObjectInputStream(input) ; // 实例化对象输入流
- Object obj = ois.readObject() ; // 读取对象
- ois.close() ; // 关闭
- System.out.println(obj) ;//输出 张三 30
- }
- };
复制代码 接口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后必须存在一个无参构造函数,因为在反序列化时会默认调用无参构造实例化对象。- package com.fjl;
- import java.io.Externalizable;
- import java.io.IOException;
- import java.io.ObjectInput;
- import java.io.ObjectOutput;
- public class Person implements Externalizable{//实现
- Externalizable 接口
-
- private String name ; // 声明name属性
- private int age ; // 声明age属性
- public Person(){} //无参构造
- public Person(String name,int age){ // 通过构造设置内容
- this.name = name ;
- this.age = age ;
- }
- public String toString(){ // 覆写toString()方法
- return "姓名:" + this.name + ";年龄:" + this.age ;
- }
- @Override
- public void writeExternal(ObjectOutput out) throws IOException {
- // TODO Auto-generated method stub
- out.writeObject(this.name);
- out.writeObject(this.age);
- }
- @Override
- public void readExternal(ObjectInput in) throws IOException,
- ClassNotFoundException {
- // TODO Auto-generated method stub
- this.name=(String) in.readObject();
- this.age=in.readInt();
- }
- }
复制代码 序列化与反序列化
***- import java.io.File ;
- import java.io.IOException ;
- import java.io.FileOutputStream ;
- import java.io.OutputStream ;
- import java.io.ObjectOutputStream ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.io.ObjectInputStream ;
- public class SerDemo03{
- public static void main(String args[]) throws Exception{
- //ser() ;
- dser() ;
- }
- public static void ser() throws Exception {//序列化
- File f = new File("D:" + File.separator + "test.txt") ; // 定义保存路径
- ObjectOutputStream oos = null ; // 声明对象输出流
- OutputStream out = new FileOutputStream(f) ; // 文件输出流
- oos = new ObjectOutputStream(out) ;
- oos.writeObject(new Person("张三",30)) ; // 保存对象
- oos.close() ; // 关闭
- }
- public static void dser() throws Exception {//反序列化
- File f = new File("D:" + File.separator + "test.txt") ; // 定义保存路径
- ObjectInputStream ois = null ; // 声明对象输入流
- InputStream input = new FileInputStream(f) ; // 文件输入流
- ois = new ObjectInputStream(input) ; // 实例化对象输入流
- Object obj = ois.readObject() ; // 读取对象
- ois.close() ; // 关闭
- System.out.println(obj) ;
- }
- };
复制代码 Externalizable 接口与Serializable接口的区别
在一般开发中,由于Serializable接口使用较方便,所以用的较多
transient关键字
实现Serializable 接口的类实际上是将一个对象中的属性全部序列化,如果希望一个对象的属性不被序列化,则用transient 关键字进行声明。- package com.test;
- import java.io.Serializable ;
- public class Person implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private transient String name ; // 声明name属性
- private int age ; // 声明age属性
- public Person(String name,int age){ // 通过构造设置内容
- this.name = name ;
- this.age = age ;
- }
- public String toString(){ // 覆写toString()方法
- return "姓名:" + this.name + ";年龄:" + this.age ;
- }
- }
复制代码 保存再读取输出:null 30
|