当前位置: 首页 > 面试题库 >

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

尉迟宣
2023-03-14
问题内容

我已经使用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;
  }

如何修改以上代码以传输文件?


问题答案:

本质上是。您需要记住,drag’n’drop API和剪贴板API使用相同的概念a
Transferable,将数据包装到DataFlavors中,因此您可以根据目标系统想要使用的风格来不同地传输数据

通常,在传输文件时,Java使用a java.util.List和a
DataFlavor.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;
        }
    }

}

在我的测试中,我能够放置FileList,裹成一个Transferable,把它传递给Clipboard,并能够通过该系统将文件粘贴(Windows资源管理器)



 类似资料:
  • 在Linux上不接触鼠标,在命令模式下的VIM和系统剪贴板之间复制粘贴的最快方法是什么?

  • 我可以使vim粘贴从和到系统的剪贴板?

  • 问题内容: 我想从Java中的系统剪贴板中粘贴。我该怎么做? 问题答案: 尽管机器人类可以工作,但它不像直接使用系统剪贴板那样优雅,例如:

  • 我想在Android API上测试剪贴板,所以我开始使用Android的ClipboardManager和ClipData类创建一个简单的应用程序。我遵循了Android网站上的“复制和粘贴”指南,尽管我必须填写几个地方,因为该指南没有每行必要的代码(但我最终不得不注释掉Intent和URI粘贴方法,因为它没有给出具体的示例,因为我假设数据是多种多样的)。我运行了应用程序,但由于某种原因,我发送的

  • 问题是,从vim到剪贴板的复制/粘贴停止工作。我不知道为什么。。。 在中,我也没有看到和缓冲区... 这是我的。vimrc,如果需要的话。 有什么建议吗? 谢谢

  • 问题内容: 如何将BufferedImage存储到系统剪贴板中? 问题答案: 这是从这里获得的工作代码,已成功测试