可传输/URL导出:在Java App和Mozilla之间传输书签数据



我正在编写一个Java应用程序,我想集成一个功能来修改Mozilla的书签数据。这听起来很复杂,但这只是一个拖放问题:

1(我不能从Mozilla库删除多个书签条目到我的Java应用程序,因为没有可用的DataFlavors。因此,显然,我无法从我得到的可转移对象中读取原始数据......单个条目附带 78 种数据风格。有没有办法启用多个书签删除?
我可以将所有书签导出为 HTML 并从我的应用程序内部导入来规避此问题,但这不是很愉快。

2(也很难弄清楚如何将任何URL导出到Mozilla书签。例如,最好的行为是Mozilla识别我的数据,就像它识别超链接一样。将链接(例如Google(从浏览器内部拖放到书签库中会立即创建一个名称为"Google"和URL为"http://www.google.com"的条目。我的应用程序被迫返回java.io.Reader的实现,因为Mozilla Firefox库显然不接受其他任何东西。

TL;DR:有什么方法(通过拖放(让我可以 1( 将多个书签从 Mozilla 导入到 Java 应用程序,2( 将任何类型的可传输数据导出到 Mozilla 书签库,以便 Firefox 直接识别名称和URL

我希望我的问题很清楚。

提前问候和感谢!

经过多次试验和错误,我注意到类型 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 + "rn" + 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/htmltext/uri-list (,以及表示类为 java.net.URL 的风格,除了 text/html 之外,这些都不能保存书签的名称,正如我上面提到的,这似乎是 Firefox 可以提供但不接受的类型。

截至 2013 年 1 月,在当前版本的 Java (7u10(/Firefox (17.0.1( 的 Windows 7 上,似乎没有办法做我想做的事情。

将多个书签拖到Java应用程序中没有任何DataFlavors,因此无法从中读取。
将书签放入 Firefox 似乎也是不可能的 - 只指定text/x-moz-url将使 Firefox "接受"数据,但 Firefox 从不尝试从中读取(这些方法永远不会被调用(。指定不仅仅是text/x-moz-url(例如 text/x-moz-url; class=java.io.Reader ( 导致 Firefox 根本不接受数据。

除非有人能提供稳定的解决方案,否则这个问题在技术上得到了回答:

这是不可能的。

最新更新