Java 系统剪贴板可以复制文件吗?
Can Java system clipboard copy a file?
我用过Java系统剪贴板来传输文字和图片,但不知道它是否可以复制和粘贴文件?如果是这样,我在哪里可以找到一些示例代码?
我在 How can I copy a file and paste it to the clipboard using Java?
发现了一个类似的问题
但是在里面找不到"clipboard"这个词,我也不知道怎么用
我复制图片的方法是这样的:
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.List
和一个DataFlavor.javaFileListFlavor
。不幸的是,没有好的 "wrapper" class 可用于此,因此您需要提供自己的,例如...
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
,将其传递给 Clipboard
并且能够通过系统(Windows Explorer)粘贴文件
我用过Java系统剪贴板来传输文字和图片,但不知道它是否可以复制和粘贴文件?如果是这样,我在哪里可以找到一些示例代码?
我在 How can I copy a file and paste it to the clipboard using Java?
发现了一个类似的问题但是在里面找不到"clipboard"这个词,我也不知道怎么用
我复制图片的方法是这样的:
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.List
和一个DataFlavor.javaFileListFlavor
。不幸的是,没有好的 "wrapper" class 可用于此,因此您需要提供自己的,例如...
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
,将其传递给 Clipboard
并且能够通过系统(Windows Explorer)粘贴文件