我想在控制台应用程序中读取剪贴板并打印出剪贴板的内容。这应该完全独立于MIME类型。据我所知,它基于数据的MIME类型完成,我应该知道我的期望。默认的DataFlavor
只支持文本和一些二进制文件。
无论如何,我想要覆盖图像,各种文本,序列化的东西和任何类型的二进制数据。
简单的部分是
Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
循环systemClipboard.getContents(null).getTransferDataFlavors()
并没有多大帮助。我也尝试创建自己的DataFlavor
,但这不起作用(根据我在Java的源代码中分析的子类型可以是“*”):
systemClipboard.getData(new DataFlavor("application/*", "bytes"))
另外,我不知道如何弄清楚MIME类型究竟是什么。我看过的没有UNIX工具可以告诉我。
我的最终目标是编写一个相反的数据生成器,这意味着创建剪贴板数据并将其提供给相关应用程序。但是,现在我必须弄清楚我需要创建的结构,这就是我首先需要该解析器的原因。
答案 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类型。也许这可以解释一些事情。