我正在编写一个Java应用程序,我想集成一个功能来修改Mozilla中的书签数据。这听起来很复杂,但这只是一个拖放问题:
1)我无法从Mozilla库中删除多个书签条目到我的Java应用程序,因为没有可用的DataFlavor。因此,显然,我无法从Transferable中读取原始数据,我得到了......单个条目带有78个DataFlavor。有没有办法让多个书签掉线?
我可以通过将所有书签导出到HTML并从我的应用程序中导入来解决这个问题,但这不是很愉快。
2)要弄清楚如何将任何URL导出到Mozilla书签也很困难。例如,最好的行为是Mozilla以与超链接相同的方式识别我的数据。删除链接,例如Google,从浏览器内部到书签库,立即创建一个名为“Google”和URL“http://www.google.com”的条目。我的应用程序虽然被迫返回java.io.Reader的实现,因为Mozilla Firefox库显然不接受任何其他内容。
TL; DR:有没有办法(通过拖放)这样我可以1)从Mozilla导入多个书签到Java App,2)将任何种类的可转移数据导出到Mozilla书签库,这样两个名称< / strong>和网址可由Firefox直接识别?
我希望我的问题很明确。
提前致意并表示感谢!
答案 0 :(得分:1)
经过多次试验和错误,我注意到类型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拖动书签并打印出支持的DataFlavor时,text/x-moz-url
根本不在列表中。仅支持字符串风格(包括text/html
和text/uri-list
)以及其表示类为java.net.URL的风格,并且除了{{{{}}之外,其中任何一个都不能保存书签的名称。 1}},正如我上面提到的,似乎是Firefox可以提供但不接受的类型。
答案 1 :(得分:0)
截至2013年1月,在 Windows 7 的当前版本的Java(7u10)/ Firefox(17.0.1)上,似乎没有办法实现我想要的目标。
将多个书签拖放到Java应用程序中时没有任何DataFlavor,因此无法从中读取它们
将书签放入Firefox似乎也是不可能的 - 仅指定text/x-moz-url
将使Firefox“接受”数据,但Firefox从不尝试从中读取(从不调用这些方法)。指定不仅仅text/x-moz-url
(例如text/x-moz-url; class=java.io.Reader
)会导致Firefox根本不接受数据。
除非有人能提供稳定的解决方案,否则这个问题在技术上得到了解答:
这是不可能的。