所有MIME类型的通用DataFlavor作为InputStream

时间:2016-09-23 20:08:47

标签: java clipboard

我想在控制台应用程序中读取剪贴板并打印出剪贴板的内容。这应该完全独立于MIME类型。据我所知,它基于数据的MIME类型完成,我应该知道我的期望。默认的DataFlavor只支持文本和一些二进制文件。

无论如何,我想要覆盖图像,各种文本,序列化的东西和任何类型的二进制数据。

简单的部分是

Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

循环systemClipboard.getContents(null).getTransferDataFlavors()并没有多大帮助。我也尝试创建自己的DataFlavor,但这不起作用(根据我在Java的源代码中分析的子类型可以是“*”):

systemClipboard.getData(new DataFlavor("application/*", "bytes"))

另外,我不知道如何弄清楚MIME类型究竟是什么。我看过的没有UNIX工具可以告诉我。

我的最终目标是编写一个相反的数据生成器,这意味着创建剪贴板数据并将其提供给相关应用程序。但是,现在我必须弄清楚我需要创建的结构,这就是我首先需要该解析器的原因。

1 个答案:

答案 0 :(得分:0)

在用反射深入潜入物体之后,我想出了这个。我知道这通常很糟糕,它实际上在未记录的类中使用了未记录的方法,这意味着这可能不适用于下一个Java版本。因为我仍然在寻找一个很好的解决方案! 如果您有答案,请不要犹豫回答!

反正:

public static void main(String[] args) throws Exception {
  Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
  System.out.println("systemClipboard: " + systemClipboard.getClass().getName());

  Method method = systemClipboard.getClass().getDeclaredMethod("getClipboardFormats");
  method.setAccessible(true);
  long[] clipboardFormats = (long[]) method.invoke(systemClipboard);

  for (long clipboardFormat : clipboardFormats) {
    String line = "format " + clipboardFormat + ": ";

    try {
      method = systemClipboard.getClass().getDeclaredMethod("getClipboardData", long.class);
      method.setAccessible(true);
      byte[] bytes = (byte[]) method.invoke(systemClipboard, clipboardFormat);

      line += "length: " + bytes.length + "\n";
      line += DatatypeConverter.printHexBinary(bytes) + "\n";
      line += new String(bytes);
    } catch (Exception e) {
      StringWriter stringWriter = new StringWriter();
      e.printStackTrace(new PrintWriter(stringWriter));
      line += stringWriter.getBuffer();
    }

    System.out.println(line);
  }

}

对于我看过的剪贴板,我注意到它实际上包含简单易读的XML。但是,使用DataFlavor可用的正常方式无法加载。我假设这是由于剪贴板中可能缺少MIME类型信息。

请注意,对于我的系统,第二行打印出systemClipboard: sun.awt.X11.XClipboard,我使用的两种方法是protected。我试图说它在任何其他人的机器上看起来都不一样。

作为想要使用上述代码的其他信息:

我运行的剪贴板格式是589(唯一有效的),460,462,463,464。根据this 589(= 0x024D)是私有剪贴板格式。

有趣的是,Java将clipboardFormat映射到MIME类型。也许这可以解释一些事情。