从剪贴板中获取可读文本

69

我已经知道如何在Java中从剪贴板获取纯文本,但有时候文本被编码在一些奇怪的 DataFlavor 中,例如从Microsoft Word或网站复制,甚至来自Eclipse的源代码。

如何从这些DataFlavor中提取纯文本?


5
谢谢,但我正在寻找Java解决方案,而不是JavaScript。 - clamp
3个回答

80
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

String data = (String) Toolkit.getDefaultToolkit()
                .getSystemClipboard().getData(DataFlavor.stringFlavor); 

利用getData()方法和stringFlavor,你应该能够从剪贴板中获取纯文本。

如果剪贴板中存在奇怪的文本,我认为这可能是将数据放入剪贴板的程序的问题。


4
警告:使用上述代码,您可能会遇到已知的Java Bug http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6606476(就像我遇到的那样),并且没有解决办法。幸运的是,我已经安装了Perl,所以我可以调用一个Perl脚本将剪贴板内容设置为纯文本。 :( - Steve Waring
1
@SteveWaring 感谢你提醒那个奇怪的无法捕获的错误。虽然我还没有测试过,但我建议将 System.err 流设置为 null 并在尝试 Dragon8 的解决方案时捕获空指针异常。(当然,完成后不要忘记将其恢复正常 ^_^) - NekoKikoushi
有没有一种在无头模式浏览器中完成这个任务的方法? - Vrushank Doshi

3
您可以使用以下方法在Java中获取剪贴板文本:
public String getClipBoard(){
    try {
        return (String)Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
    } catch (HeadlessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();            
    } catch (UnsupportedFlavorException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();            
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "";
}

0

首先,我还没有使用过剪贴板,但这似乎很有趣。

来自http://docstore.mik.ua/orelly/java/awt/ch16_01.htm

“要从剪贴板读取数据,程序调用Transferable.getTransferData()方法。如果数据由一个不对应于Java类的DataFlavor表示(例如plainTextFlavor),getTransferData()会返回一个InputStream供您从中读取数据。”

所以,如果你给它一个不对应的类,你会得到InputStream,然后你可以自己从InputStream中读取“纯文本”。


2
自 Java 1.3 开始,DataFlavor.plainTextFlavor 已被弃用。 - Huxi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接