JDK7 API:java.beans中XMLEncoder和XMLDecoder

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工具包中的一些用户界面组件:

    <?xml version="1.0" encoding="UTF-8"?>
     <java version="1.0" class="java.beans.XMLDecoder">
     <object class="javax.swing.JFrame">
       <void property="name">
         <string>frame1</string>
       </void>
       <void property="bounds">
         <object class="java.awt.Rectangle">
           <int>0</int>
           <int>0</int>
           <int>200</int>
           <int>200</int>
         </object>
       </void>
       <void property="contentPane">
         <void method="add">
           <object class="javax.swing.JButton">
             <void property="label">
               <string>Hello</string>
             </void>
           </object>
         </void>
       </void>
       <void property="visible">
         <boolean>true</boolean>
       </void>
     </object>
     </java>

     

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

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

     

    • 默认方法名称为“new”。
    • 对java类的引用以<class> javax.swing.JButton </ class>的形式编写。
    • 使用基元类型的名称作为标记来编写Java基元类型的包装类的实例。例如,Integer可以编写类的实例:<int> 123 </ int>。请注意,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

  • 方法摘要

    方法 
    修饰符和类型方法和描述
    voidclose()
    此方法调用flush,写入关闭后同步码,然后关闭与此流关联的输出流。
    voidflush()
    如果尚未编写,则此方法会写出与XML编码关联的前导码,然后写出自上次flush 调用以来写入流的所有值。
    ObjectgetOwner()
    获取此编码器的所有者。
    voidsetOwner(Object owner)
    将此编码器的所有者设置为owner
    voidwriteExpression(Expression oldExp)
    记录表达式,以便在刷新流时编码器将生成实际输出。
    voidwriteObject(Object o)
    将指定对象的XML表示写入输出。
    voidwriteStatement(Statement oldStm)
    记录Statement,以便在刷新流时Encoder将生成实际输出。
  • 构造函数摘要

    构造函数 
    构造函数和描述
    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)

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

      具体说明:

      close 在界面中 AutoCloseable

  • 构造函数详细信息

    • 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类

  • 所有已实现的接口:

    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();
  • 方法细节

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

      具体说明:

      close 在界面中 AutoCloseable

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

      参数:

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

      也可以看看:

      getExceptionListener()

    • 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文档包含<java>元素的上下文中的方法调用,则应使用此方法。null在这种情况下,该值可能导致非法解析。如果owner类不包含预期的调用方法,则可能会出现同样的问题。详情请见此处

      参数:

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

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

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

      返回:

      DefaultHandlerSAX解析器的实例

      以来:

      1.7

  • 构造函数详细信息

    • 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值