java 数据传输_Java数据传递

本文深入探讨Java中的数据传输机制,重点介绍了Transferable和DataFlavor类的作用及使用方法。通过实例展示如何处理不同格式的数据,如文本、图像及Java对象等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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: /;

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

/; 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;

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的值是"/; class=",那么它将同样会调用new DataFlavor(Class.forName()。否则:

representationClass =

mimeType = /; class=

humanPresentableName = /

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值