0

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

1) 我不能真正从 Mozilla 库中将一个以上的书签条目放到我的 Java 应用程序中,因为没有可用的 DataFlavors。因此,很明显,我无法从我得到的 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 应用程序和 2)将任何类型的可传输数据导出到 Mozilla 书签库,以便Firefox 直接识别名称URL ?

我希望我的问题很清楚。

提前致以问候和感谢!

4

2 回答 2

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 中拖动书签并打印出支持的 DataFlavors 时,text/x-moz-url它根本不在列表中。仅支持字符串风格(包括text/htmltext/uri-list),以及表示类为 java.net.URL 的风格,除了 之外text/html,没有一个可以保存书签的名称,正如我上面提到的,它似乎是 Firefox 可以提供的类型,但是不会接受。

于 2012-12-31T16:25:58.740 回答
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 根本不接受数据。

除非有人可以提供稳定的解决方案,否则从技术上回答这个问题:

这是不可能的。

于 2013-01-11T12:35:19.537 回答