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();
}
}