Java 将文件复制到剪贴板

Java 将文件复制到剪贴板,java,linux,file,clipboard,Java,Linux,File,Clipboard,我正在尝试将文件复制到系统的剪贴板中。正如我在互联网上所发现的那样,我正试图做到这一点: final List<File> files = new ArrayList<File>(); files.add(new File("pathToFile")); Toolkit.getDefaultToolkit().getSystemClipboard().setContents( new Transferable() { @Override publ

我正在尝试将文件复制到系统的剪贴板中。正如我在互联网上所发现的那样,我正试图做到这一点:

final List<File> files = new ArrayList<File>();
files.add(new File("pathToFile"));

Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
    new Transferable() {
    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] { DataFlavor.javaFileListFlavor };
    }

    @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return DataFlavor.javaFileListFlavor.equals(flavor);
    }

    @Override
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        return files;
    }
}, null);
final List files=new ArrayList();
添加(新文件(“路径文件”);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
新的可转让文件(){
@凌驾
公共DataFlavor[]getTransferDataFlavors(){
返回新的DataFlavor[]{DataFlavor.javaFileListFlavor};
}
@凌驾
支持公共布尔值IsDataFlavor(DataFlavor){
返回DataFlavor.javaFileListFlavor.equals(flavor);
}
@凌驾
公共对象getTransferData(DataFlavor flavor)引发不受支持的LavorException、IOException{
归还文件;
}
},空);
但是,在运行该代码后,我无法从剪贴板粘贴文件(在桌面和系统资源管理器中尝试)。我甚至试着在事后进入睡眠状态,因为我读到JVM必须运行才能粘贴剪贴板内容,但它对我不起作用。
然而
Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null)正在返回我复制到剪贴板中的相应文件。
我发现的一件事是
Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(DataFlavor.javaFileListFlavor)返回
false
。这是否意味着剪贴板不支持文件?这没有意义,因为我可以使用Ctlr+C和Ctrl+V在资源管理器中复制粘贴文件

我不知道这是否重要,但我正在LinuxMint下运行测试


谁能解释一下为什么我不能粘贴复制的文件,或者我必须如何复制它才能通过Ctrl+V系统范围粘贴它?

您可以使用终端命令

String[] args = new String[] {"/bin/bash", "-c","Your command at terminal", "with", "args"};
Process proc = new ProcessBuilder(args).start();

您可以使用终端命令

String[] args = new String[] {"/bin/bash", "-c","Your command at terminal", "with", "args"};
Process proc = new ProcessBuilder(args).start();

这个问题不时出现,但从未得到回答。我做了一点试验。当我从Finder(我在Mac电脑上)复制文件时,Java看到的剪贴板上填充了“Java文件列表”风格以及一系列其他风格,这些风格似乎是文件列表的表示形式,如字符串、读取器、字符数组等。但我自己却用“Java文件列表”填充剪贴板不会激发Finder让我将这些文件粘贴到文件夹中。真正奇怪的是,如果我将“Java文件列表”设置到剪贴板中,然后立即检索它,我会得到一个“Java文件列表”,正如我所期望的那样。但是如果我再次运行Java程序并检查剪贴板,它会有很多新的表示形式,类似于我从Finder复制时看到的表示形式。因此,在我的Java程序将内容放在剪贴板上之后,似乎有什么东西在增加剪贴板。也许这是Mac的事情。我认为你最好的策略是从桌面复制文件,看看它们在剪贴板中的外观,无论是从Java还是从Linux(可能有一个剪贴板查看器程序),然后尝试从Java复制该状态。通过Ctrl+C复制时,剪贴板似乎包含一个
ClipboardTransferable
对象,但如果我尝试自己创建一个对象,编译器会告诉我没有这样的类。。。当使用普通的
Transferable
作为剪贴板内容时,它被存储为
TransferableProxy
这个问题不时出现,但从未得到回答。我尝试了一下。当我从Finder(我在Mac电脑上)复制文件时,Java看到的剪贴板上填充了“Java文件列表”风格以及一系列其他风格,这些风格似乎是文件列表的表示形式,如字符串、读取器、字符数组等。但我自己却用“Java文件列表”填充剪贴板不会激发Finder让我将这些文件粘贴到文件夹中。真正奇怪的是,如果我将“Java文件列表”设置到剪贴板中,然后立即检索它,我会得到一个“Java文件列表”,正如我所期望的那样。但是如果我再次运行Java程序并检查剪贴板,它会有很多新的表示形式,类似于我从Finder复制时看到的表示形式。因此,在我的Java程序将内容放在剪贴板上之后,似乎有什么东西在增加剪贴板。也许这是Mac的事情。我认为你最好的策略是从桌面复制文件,看看它们在剪贴板中的外观,无论是从Java还是从Linux(可能有一个剪贴板查看器程序),然后尝试从Java复制该状态。通过Ctrl+C复制时,剪贴板似乎包含一个
ClipboardTransferable
对象,但如果我尝试自己创建一个对象,编译器会告诉我没有这样的类。。。当使用普通的
Transferable
作为剪贴板内容时,它存储为
TransferableProxy
这将是一个很大的工作,因为您必须为每个操作系统实现它,甚至为同一操作系统的不同发行版分别实现它。这将是一个很大的工作,因为您必须为每个操作系统甚至不同的应用程序实现它同一操作系统的独立分布