java - Java系统剪贴板可以复制文件吗?

标签 java file clipboard

我使用Java系统剪贴板来传输文本和图像,但我不知道它是否可以复制和粘贴文件?如果是这样,我在哪里可以找到一些示例代码?

我发现了类似的问题:How can I copy a file and paste it to the clipboard using Java?

但是我在其中找不到“剪贴板”这个词,而且我不知道如何使用它。

我用来复制图像的方法如下所示:

  public static void setClipboard(Image image)                                           // This method writes a image to the system clipboard : from exampledepot.com
  {
    ImageSelection imgSel=new ImageSelection(image);
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel,null);
  }

  public Image getImageFromClipboard()                                                   // Get an image off the system clipboard 
  {
    Transferable transferable=Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
    if (transferable!=null&&transferable.isDataFlavorSupported(DataFlavor.imageFlavor))
    {
      try { return (Image)transferable.getTransferData(DataFlavor.imageFlavor); }
      catch (UnsupportedFlavorException e) { e.printStackTrace(); }
      catch (IOException e) { e.printStackTrace(); }
    }
    else System.err.println("getImageFromClipboard: That wasn't an image!");
    return null;
  }

如何修改上面的代码来传输文件?

最佳答案

本质上是的。您需要记住,拖放 API 和剪贴板 API 使用相同的 Transferable 概念,它将数据包装到 DataFlavor 中,因此您可以根据目标系统想要使用的风格以不同的方式传输数据

通常,在传输文件时,Java 使用 java.util.ListDataFlavor.javaFileListFlavor。不幸的是,没有可用的漂亮的“包装”类,因此您需要提供自己的,例如......

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        File file = new File("/path/to/your/file");
        List listOfFiles = new ArrayList();
        listOfFiles.add(file);

        FileTransferable ft = new FileTransferable(listOfFiles);

        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ft, new ClipboardOwner() {
            @Override
            public void lostOwnership(Clipboard clipboard, Transferable contents) {
                System.out.println("Lost ownership");
            }
        });
    }

    public static class FileTransferable implements Transferable {

        private List listOfFiles;

        public FileTransferable(List listOfFiles) {
            this.listOfFiles = listOfFiles;
        }

        @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 listOfFiles;
        }
    }

}

在我的测试中,我能够将 File 放入 List 中,包装到 Transferable 中,然后将其传递给 >剪贴板并能够通过系统(Windows资源管理器)粘贴文件

关于java - Java系统剪贴板可以复制文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31798646/

相关文章:

java - java中使用递归计算链表中的出现次数

java - 如何编写 NullPointerException 安全方法和表达式?

java - 从 jar 中读取资源文件

ssh - 连接到系统 : neovim inside tmux inside ssh

c++ - 如何删除 Windows 10 版本 1809 剪贴板历史记录?

python - 如何将字符串复制到剪贴板?

Java:存储数据库中的信息。哪些 Collection 合适?

java - 为什么当日期在 1970-01-01 之后时 java.sql.Timestamp 返回负值

java - 通过修改desktop.ini来更改图标的文件夹

C 文件程序不执行 fopen