经过多次尝试和错误,我注意到该类型text/x-moz-url
实际上根本不是文本类型,而是二进制类型。它从来没有与之关联的字符集;它始终是 UTF-16LE。
以下对我有用,至少在 x86 Linux 中,但它根本不适用于 Windows 版本的 Firefox:
static class Bookmark
implements Transferable {
private final String mimeType;
private final byte[] bytes;
Bookmark(String uri,
String name) {
String text = uri + "\r\n" + name;
this.bytes = text.getBytes(StandardCharsets.UTF_16LE);
this.mimeType = "text/x-moz-url";
}
public DataFlavor[] getTransferDataFlavors() {
try {
return new DataFlavor[] {
new DataFlavor(mimeType + "; class=java.io.InputStream"),
new DataFlavor(mimeType + "; class=java.nio.ByteBuffer"),
new DataFlavor(mimeType + "; class=\"[B\""),
};
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.isMimeTypeEqual(mimeType);
}
public Object getTransferData(DataFlavor flavor)
throws IOException,
UnsupportedFlavorException {
Class<?> cls = flavor.getRepresentationClass();
if (cls.equals(byte[].class)) {
return bytes;
}
if (cls.equals(ByteBuffer.class)) {
return ByteBuffer.wrap(bytes);
}
if (cls.equals(InputStream.class)) {
return new ByteArrayInputStream(bytes);
}
throw new UnsupportedFlavorException(flavor);
}
}
它在 Windows 中不起作用的原因是 Windows 版本的 Firefox 显然不使用text/x-moz-url
. 当我从 Firefox 中拖动书签并打印出支持的 DataFlavors 时,text/x-moz-url
它根本不在列表中。仅支持字符串风格(包括text/html
和text/uri-list
),以及表示类为 java.net.URL 的风格,除了 之外text/html
,没有一个可以保存书签的名称,正如我上面提到的,它似乎是 Firefox 可以提供的类型,但是不会接受。