Java数据传递

java.awt.datatransfer.*

由于数据具有各种各样的格式,为了方便,java用Transferable封装了要传递的数据,用DataFlavor封装了数据格式。

Transferable

  • Transferable

    • getTransferDataFlavors() : DataFlavor[]

      支持的数据格式

    • isDataFlavorSupported(DataFlavor flavor) : boolean

      数据格式是否支持

    • getTransferData(DataFlavor flavor) : Object

      取出数据,它可抛出两个异常:

      • UnsupportedFlavorException
      • IOException

DataFlavor

对MIME类型的封装

DataFlavor表示数据格式,它封装了MIME类型,它可以有一个class参数,用于加载数据所代表的类。

MIME类型语法一般在HTTP请求中作为ContentType的值:

ContentType: <primary type>/<subtype>;

如果数据是一个Java类,那么就要附加一个class参数,用于加载数据所代表的类:

<primary type>/<subtype>; class=<representation class>

举例个例子:

image/x-java-image; class=java.awt.Image
  • primary type : image
  • subtype : x-java-image
  • representation class : java.awt.Image

如果数据不是Java类,那么representation class则为java.io.InputStream;如果数据是文本,它可以有一个charset参数,用于指定字符集:

text/html; charest=utf-8
两个DataFlavor的equals原则

满足下列条件

  • primary type相等
  • subtype相等
  • representation class相等

此外如果primary type是text,那么就是一个支持charset参数文本格式,并且如果representation class不是java.io.Reader, java.lang.String, java.nio.CharBuffer[C(这个源代码中文档注释的[C不知道是什么意思,可能是作者笔误,难道是Ctrl+C),那么charset必须也相等。如果没有给其中一个或两个DataFlavor指定charset,那么使用平台默认字符集。支持charset参数的文本格式清单详见selectBestTextFlavor

构造器

DataFlavor有几个构造器:

  • DataFlavor()

    这个构造器仅用于为了支持Externalizable interface的目的。它不打算公开使用

  • DataFlavor(Class<?> representationClass, String humanPresentableName)

    representationClass:数据所代表的类

    humanPresentableName:用于标识数据格式的可读字符串,如果为null,那么application/x-java-serialized-object将作为它的值。

    返回的DataFlavor

    representationClass = representationClass
    mimeType = application/x-java-serialized-object; <representationClass>
    humanPresentableName = application/x-java-serialized-object
    
  • DataFlavor(String mimeType, String humanPresentableName, ClassLoader classLoader)

  • DataFlavor(String mimeType, String humanPresentableName)

  • DataFlavor(String mimeType)

    mimeType:MIME Type ,如果没有class= 参数,或如果这个class= 代表的类没有成功加载,那么将抛出IllegalArgumentException异常。

    humanPresentableName:同上。

    classLoader: 类加载器。

    如果mimeType的值是"<primary type>/<subtype>; class=<representation class>",那么它将同样会调用new DataFlavor(Class.forName(<representation class>)。否则:

    representationClass = <representation class>
    mimeType = <primary type>/<subtype>; class=<representation class>
    humanPresentableName = <primary type>/<subtype>
    

    throws ClassNotFoundException

    throws IllegalArgumentException

内置格式
  • DataFlavor.stringFlavor

    application/x-java-serialized-object; class=java.lang.String

  • DataFlavor.imageFlavor

    image/x-java-image; class=java.awt.Image

  • DataFlavor.javaFileListFlavor

    application/x-java-file-list; class=java.util.List

  • DataFlavor.selectionHtmlFlavor

    text/html; document=selection; class=java.lang.String; charset=Unicode

  • DataFlavor.fragmentHtmlFlavor

    text/html; document=fragment; class=java.lang.String; charset=Unicode

  • DataFlavor.allHtmlFlavor

    text/html; document=all; class=java.lang.String; charset=Unicode

内置MIME
  • DataFlavor.javaSerializedObjectMimeType

    application/x-java-serialized-object

  • DataFlavor.javaJVMLocalObjectMimeType

    application/x-java-jvm-local-objectref

  • DataFlavor.javaRemoteObjectMimeType

    application/x-java-remote-object

示例代码

图片数据

public class ImageSelection implements Transferable {
  private Image image;
  public ImageSelection(Image image) {
    this.image = image;
  }
  
  @Override
  public DataFlavor[] getTransferDataFlavors() {
    return new DataFlavor[] {DataFlavor.imageFlavor};
  }
  
  @Override
  public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
  	if(isDataFlavorSupported(flavor)) return image;
    throw new UnsupportedFlavorException(flavor);
  }
  
  @Override
  public boolean isDataFlavorSupported(DataFlavor flavor) {
    return flavor.equals(DataFlavor.imageFlavor);
  }
}

Java对象数据

可以在两个JVM间中传递

public class ObjectSelection implements Transferable {
  private Object obj;
  private DataFlavor objectFlavor;
  public ObjectSelection(Object obj) {
    this.obj = obj;
    try {
      this.flavor = new DataFlavor(getMimeType());
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      return null;
    }
  }
  
  @Override
  public DataFlavor[] getTransferDataFlavors() {
		return new DataFlavor[] {objectFlavor};
  }
  
  @Override
  public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
    if (isDataFlavorSupported(flavor)) return obj;
    throw new UnsupportedFlavorException(flavor);
  }
  
  @Override
  public boolean isDataFlavorSupported(DataFlavor flavor) {
    return flavor.equals(objectFlavor);
  }
  
  private String getMimeType() {
    return DataFlavor.javaJVMLocalObjectMimeType + "; class=" + obj.getClass().getName();
  }
}
posted @ 2020-05-02 22:10  MatroLeox  阅读(703)  评论(0编辑  收藏  举报