JDK7 API:java.beans中XMLEncoder和XMLDecoder

原文链接: https://my.oschina.net/boonya/blog/3096903
java.beans中

XMLEncoder类

  • java.lang.Object继承
  • java.beans.Encoder中
  • java.beans.XMLEncoder中
  • 所有已实现的接口:

    AutoCloseable


     
    公共类XMLEncoder 
    扩展Encoder 
    实现AutoCloseable
    所述XMLEncoder类是互补替代ObjectOutputStream,并且可以用于产生的文本表示的JavaBean以相同的方式,该ObjectOutputStream可被用来创建的二进制表示Serializable 的对象。例如,以下片段可用于创建提供的JavaBean 及其所有属性的文本表示:
           XMLEncoder e = new XMLEncoder(
                              新的BufferedOutputStream(
                                  new FileOutputStream(“Test.xml”)));
           e.writeObject(new JButton(“Hello,world”));
           e.close();
     
    尽管它们的API相似,但XMLEncoder 该类专门用于将JavaBean的图形存档为其公共属性的文本表示。与Java源文件一样,以这种方式编写的文档对所涉及的类的实现中的更改具有天然的免疫力。在ObjectOutputStream继续推荐进程间通信和通用序列化。

    XMLEncoder类提供了一个默认的外延 的JavaBean S IN它们表示为具有XML规范和Unicode / ISO 10646的字符集的UTF-8字符编码的版本1.0符合XML文档。XMLEncoder该类生成的XML文档是:

    • 可移植和版本弹性:它们不依赖于任何类的私有实现,因此,与Java源文件一样,它们可以在可能具有某些类的不同版本的环境之间以及来自不同供应商的VM之间交换。
    • 结构紧凑XMLEncoder该类在内部使用冗余消除算法,因此Bean的属性的默认值不会写入流。
    • 容错:文件中的非结构性错误,由文件损坏或对归档中的类所做的API更改导致本地化,以便读者可以报告错误并继续加载文档的不是受错误影响。

    下面是一个XML存档的示例,其中包含swing工具包中的一些用户界面组件:

    
     
     
       
         frame1
       
       
         
           0
           0
           200
           200
         
       
       
         
           
             
               Hello
             
           
         
       
       
         true
       
     
     

     

  • XML语法使用以下约定:
    • 每个元素代表一个方法调用。
    • “object”标记表示一个表达式,其值将用作封闭元素的参数。
    • “void”标记表示将被执行的语句,但其结果不会用作封闭方法的参数。
    • 包含元素的元素将这些元素用作参数,除非它们具有标记:“void”。
    • 方法的名称由“method”属性表示。
    • XML的标准“id”和“idref”属性用于引用先前的表达式 - 以便处理对象图中的圆形。
    • “class”属性用于明确指定静态方法或构造函数的目标; 它的值是类的完全限定名称。
    • 如果没有“class”属性定义目标,则使用外部上下文作为目标执行具有“void”标记的元素。
    • Java的String类是专门处理的,写成 Hello,world ,其中字符串的字符使用UTF-8字符编码转换为字节。

    尽管可以仅使用这三个标记来编写所有对象图,但是包含以下定义,以便可以更简洁地表达公共数据结构:

     

    • 默认方法名称为“new”。
    • 对java类的引用以 javax.swing.JButton 的形式编写。
    • 使用基元类型的名称作为标记来编写Java基元类型的包装类的实例。例如,Integer可以编写类的实例: 123 。请注意,XMLEncoder该类使用Java的反射包,其中Java的基元类型与其关联的“包装类”之间的转换是在内部处理的。XMLEncoder类本身的API 仅处理Objects。
    • 在表示名称以“get”开头的nullary方法的元素中,“method”属性被替换为“property”属性,其属性值通过删除“get”前缀并对结果进行decapitalizing来给出。
    • 在表示名称以“set”开头的monadic方法的元素中,“method”属性被替换为“property”属性,该属性的值通过删除“set”前缀并对结果进行decapital来给出。
    • 在表示名为“get”的方法的元素中,取一个整数参数,“method”属性将替换为“index”属性,其值为第一个参数的值。
    • 在表示名为“set”的方法的元素中,该方法采用两个参数,第一个是整数,“method”属性替换为“index”属性,其值为第一个参数的值。
    • 使用“array”标记写入对数组的引用。“class”和“length”属性分别指定数组的子类型及其长度。

    有关更多信息,您可能还需要查看 使用XMLEncoder,这是Swing Connection中的一篇文章

    以来:

    1.4

    也可以看看:

    XMLDecoder, ObjectOutputStream

  • 方法摘要

    方法 
    修饰符和类型 方法和描述
    void close()
    此方法调用flush,写入关闭后同步码,然后关闭与此流关联的输出流。
    void flush()
    如果尚未编写,则此方法会写出与XML编码关联的前导码,然后写出自上次flush 调用以来写入流的所有值。
    Object getOwner()
    获取此编码器的所有者。
    void setOwner(Object owner)
    将此编码器的所有者设置为owner
    void writeExpression(Expression oldExp)
    记录表达式,以便在刷新流时编码器将生成实际输出。
    void writeObject(Object o)
    将指定对象的XML表示写入输出。
    void writeStatement(Statement oldStm)
    记录Statement,以便在刷新流时Encoder将生成实际输出。
    • 从类java.beans继承的方法。编码器

      get, getExceptionListener, getPersistenceDelegate, remove, setExceptionListener, setPersistenceDelegate
    • 从类java.lang继承的方法。宾语

      clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 构造函数摘要

    构造函数 
    构造函数和描述
    XMLEncoder(OutputStream out)
    创建一个新的XML编码器,使用XML编码将JavaBeans写入 流中out
    XMLEncoder(OutputStream out, String charset, boolean declaration, int indentation)
    创建一个新的XML编码器,使用给定的给定 开头将JavaBeans写出 到流中。outcharsetindentation
  • 方法细节

    • setOwner

      public void setOwner(Object  owner)
      将此编码器的所有者设置为owner

      参数:

      owner - 此编码器的所有者。

      也可以看看:

      getOwner()

    • getOwner

      public  Object  getOwner()
      获取此编码器的所有者。

      返回:

      此编码器的所有者。

      也可以看看:

      setOwner(java.lang.Object)

    • writeObject

      public void writeObject(Object  o)
      将指定对象的XML表示写入输出。

      覆盖:

      writeObject 在班上 Encoder

      参数:

      o - 要写入流的对象。

      也可以看看:

      XMLDecoder.readObject()

    • writeStatement

      public void writeStatement(Statement  oldStm)
      记录Statement,以便在刷新流时Encoder将生成实际输出。

      只应在初始化持久委托的上下文中调用此方法。

      覆盖:

      writeStatement 在班上 Encoder

      参数:

      oldStm - 将写入流的语句。

      也可以看看:

      PersistenceDelegate.initialize(java.lang.Class, java.lang.Object, java.lang.Object, java.beans.Encoder)

    • writeExpression

      public void writeExpression(Expression  oldExp)
      记录表达式,以便在刷新流时编码器将生成实际输出。

      只应在初始化持久委托或设置编码器以从资源包中读取的上下文中调用此方法。

      有关将资源包与XMLEncoder一起使用的更多信息,请参阅http://java.sun.com/products/jfc/tsc/articles/persistence4/#i18n

      覆盖:

      writeExpression 在班上 Encoder

      参数:

      oldExp - 将写入流的表达式。

      也可以看看:

      PersistenceDelegate.initialize(java.lang.Class, java.lang.Object, java.lang.Object, java.beans.Encoder)

    • flush

      public void flush()
      如果尚未编写,则此方法会写出与XML编码关联的前导码,然后写出自上次flush 调用以来写入流的所有值。刷新后,将清除对写入此流的值的所有内部引用。
    • close

      public void close()
      此方法调用flush,写入关闭后同步码,然后关闭与此流关联的输出流。

      具体说明:

      close 在界面中 AutoCloseable

  • 构造函数详细信息

    • XMLEncoder

      public XMLEncoder(OutputStream  out)
      创建一个新的XML编码器,使用XML编码将JavaBeans写入 流中out

      参数:

      out - 将写入对象的XML表示的流

      抛出:

      IllegalArgumentException- 如果out是的话null

      也可以看看:

      XMLDecoder.XMLDecoder(InputStream)

    • XMLEncoder

      public XMLEncoder(OutputStream  out,
                 String  charset,
                布尔声明,
                int indentation)
      创建一个新的XML编码器,使用给定的给定 开头将JavaBeans写出 到流中。outcharsetindentation

      参数:

      out - 将写入对象的XML表示的流

      charset - 请求的字符集的名称; 可以是规范名称或别名

      declaration - 是否应生成XML声明; 将false 内容嵌入另一个XML文档时设置此项

      indentation - 用于缩进整个XML文档的空格字符数

      抛出:

      IllegalArgumentException- if outcharsetis null,或者是否indentation小于0

      IllegalCharsetNameException- 如果charset名字是非法的

      UnsupportedCharsetException - 如果在此Java虚拟机实例中不支持指定的charset

      UnsupportedOperationException - 如果加载的charset不支持编码

      以来:

      1.7

      也可以看看:

      Charset.forName(String)

java.beans中

XMLDecoder类

  • java.lang.Object继承
  • java.beans.XMLDecoder中
  • 所有已实现的接口:

    AutoCloseable


     
    公共类XMLDecoder 
    extends Object 
    实现AutoCloseable
    XMLDecoder类用于读取使用创建的XML文档XMLEncoder,并使用一样的ObjectInputStream。例如,可以使用以下片段来读取由XMLEncoder 类编写的XML文档中定义的第一个对象:
    XMLDecoder d = new XMLDecoder(
                              new BufferedInputStream(
                                  new FileInputStream("Test.xml")));
           Object result = d.readObject();
           d.close();
  • 有关更多信息,您可能还需要查看 JavaBeans组件的长期持久性:XML Schema,这是Swing Connection中的一篇文章

    以来:

    1.4

    也可以看看:

    XMLEncoder, ObjectInputStream

  • 方法摘要

    方法 
    修饰符和类型 方法和描述
    void close()
    此方法关闭与此流关联的输入流。
    static DefaultHandler createHandler(Object owner, ExceptionListener el, ClassLoader cl)
    为SAX解析器创建一个新的处理程序,可用于解析由XMLEncoder类创建的嵌入式XML存档。
    ExceptionListener getExceptionListener()
    获取此流的异常处理程序。
    Object getOwner()
    获取此解码器的所有者。
    Object readObject()
    从基础输入流中读取下一个对象。
    void setExceptionListener(ExceptionListener exceptionListener)
    将此流的异常处理程序设置为exceptionListener
    void setOwner(Object owner)
    将此解码器的所有者设置为owner
    • 从类java.lang继承的方法。宾语

      clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 构造函数摘要

    构造函数 
    构造函数和描述
    XMLDecoder(InputSource is)
    创建一个新的解码器来解析由XMLEncoder类创建的XML存档。
    XMLDecoder(InputStream in)
    创建一个新的输入流,用于读取由XMLEncoder类创建的归档。
    XMLDecoder(InputStream in, Object owner)
    创建一个新的输入流,用于读取由XMLEncoder类创建的归档。
    XMLDecoder(InputStream in, Object owner, ExceptionListener exceptionListener)
    创建一个新的输入流,用于读取由XMLEncoder类创建的归档。
    XMLDecoder(InputStream in, Object owner, ExceptionListener exceptionListener, ClassLoader cl)
    创建一个新的输入流,用于读取由XMLEncoder类创建的归档。
  • 方法细节

    • close

      public void close()
      此方法关闭与此流关联的输入流。

      具体说明:

      close 在界面中 AutoCloseable

    • setExceptionListener

      public void setExceptionListener(ExceptionListener  exceptionListener)
      将此流的异常处理程序设置为exceptionListener。当此流捕获可恢复的异常时,将通知异常处理程序。

      参数:

      exceptionListener - 此流的异常处理程序; 如果null将使用默认的异常监听器。

      也可以看看:

      getExceptionListener()

    • getExceptionListener

      public  ExceptionListener  getExceptionListener()
      获取此流的异常处理程序。

      返回:

      此流的异常处理程序。如果未明确设置,则返回默认异常侦听器。

      也可以看看:

      setExceptionListener(java.beans.ExceptionListener)

    • readObject

      public  Object  readObject()
      从基础输入流中读取下一个对象。

      返回:

      下一个对象读取

      抛出:

      ArrayIndexOutOfBoundsException - 如果流不包含任何对象(或没有更多对象)

      也可以看看:

      XMLEncoder.writeObject(java.lang.Object)

    • setOwner

      public void setOwner(Object  owner)
      将此解码器的所有者设置为owner

      参数:

      owner - 此解码器的所有者。

      也可以看看:

      getOwner()

    • getOwner

      public  Object  getOwner()
      获取此解码器的所有者。

      返回:

      这个解码器的拥有者。

      也可以看看:

      setOwner(java.lang.Object)

    • createHandler

      public static  DefaultHandler  createHandler(Object  owner,
                                  ExceptionListener  el,
                                  ClassLoader  cl)
      为SAX解析器创建一个新的处理程序,可用于解析由XMLEncoder类创建的嵌入式XML存档。owner如果解析的XML文档包含元素的上下文中的方法调用,则应使用此方法。null在这种情况下,该值可能导致非法解析。如果owner类不包含预期的调用方法,则可能会出现同样的问题。详情请见此处。

      参数:

      owner - 可以用作元素值的默认处理程序的所有者

      el- 解析器的异常处理程序,或null使用默认的异常处理程序

      cl- 用于实例化对象或null使用默认类加载器的类加载器

      返回:

      DefaultHandlerSAX解析器的实例

      以来:

      1.7

  • 构造函数详细信息

    • XMLDecoder

      public XMLDecoder(InputStream  in)
      创建一个新的输入流,用于读取由XMLEncoder类创建的归档。

      参数:

      in - 底层流。

      也可以看看:

      XMLEncoder.XMLEncoder(java.io.OutputStream)

    • XMLDecoder

      public XMLDecoder(InputStream  in,
                 Object  owner)
      创建一个新的输入流,用于读取由XMLEncoder类创建的归档。

      参数:

      in - 底层流。

      owner - 此流的所有者。

    • XMLDecoder

      public XMLDecoder(InputStream  in,
                 Object  owner,
                 ExceptionListener  exceptionListener)
      创建一个新的输入流,用于读取由XMLEncoder类创建的归档。

      参数:

      in - 底层流。

      owner - 此流的所有者。

      exceptionListener - 流的异常处理程序; 如果null将使用默认的异常监听器。

    • XMLDecoder

      public XMLDecoder(InputStream  in,
                 Object  owner,
                 ExceptionListener  exceptionListener,
                 ClassLoader  cl)
      创建一个新的输入流,用于读取由XMLEncoder类创建的归档。

      参数:

      in - 底层流。 null可能会毫无错误地传递,但生成的XMLDecoder将无用

      owner - 此流的所有者。 null是一个合法的价值

      exceptionListener- 流的异常处理程序,或 null使用默认值

      cl - 用于实例化对象的类加载器。 null表示应该使用默认的类加载器

      以来:

      1.5

    • XMLDecoder

      public XMLDecoder(InputSource  是)
      创建一个新的解码器来解析由XMLEncoder类创建的XML存档。如果输入源isnull,则不会抛出异常并且不执行解析。此行为类似于InputStream用作参数的其他构造函数的行为。

      参数:

      is - 要解析的输入源

      以来:

      1.7

 

原始XMLEncoder和XMLDecoder

package com.boonya.xml;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import javax.swing.JButton;

public class XMLParser {

	public void decode(String path) throws FileNotFoundException {
		XMLDecoder d = new XMLDecoder(new BufferedInputStream(
				new FileInputStream(path)));
		Object result = d.readObject();
		System.out.println(result);
		d.close();
	}

	public void encode(String path) throws FileNotFoundException {
		XMLEncoder e = new XMLEncoder(new BufferedOutputStream(
				new FileOutputStream(path)));
		e.writeObject(new JButton("Hello, world"));
		e.close();
	}
	
	public static void main(String[] args) throws FileNotFoundException {
		XMLParser parser=new XMLParser();
		parser.decode("C:\\DEVELOPERS\\Test.xml");
		
		parser.encode("C:\\DEVELOPERS\\Test.xml");
		
	}

}

 

转载于:https://my.oschina.net/boonya/blog/3096903

你可能感兴趣的:(JDK7 API:java.beans中XMLEncoder和XMLDecoder)