java对于粘贴板的操作(复制和粘贴),系统粘贴板(包含图片和文本)

Java提供两种类型的剪贴板:系统的和本地的.
(1)本地剪贴板只在当前虚拟机中有效.Java允许多个本地剪贴板同时存在,可以方便地通过剪贴板的名称来进行存取访问.
(2)系统剪贴板与同等操作系统直接关连,允许应用程序与运行在该操作系统下的其它程序之间进行信息交换.

下边为java对于系统粘贴板可以进行的操作,对文本和图片的复制以及粘贴(对图片用的是File,当然也可以手动绘制Image对象只需要修改部分方法即可)

package clipboard;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

public class ClipboardTest {

	/**
	 * 将字符串赋值到系统粘贴板
	 * @param data 要复制的字符串
	 */
	public void setClipboardString(String data) {
		// 获取系统剪贴板
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		// 封装data内容
		Transferable ts = new StringSelection(data);
		// 把文本内容设置到系统剪贴板
		clipboard.setContents(ts, null);
	}

	/**
	 * 得到系统粘贴板上的String对象
	 * @return  内容
	 */
	public String getClipboardString() {
		//获取系统粘贴板   
		//Toolkit类:Abstract Window Toolkit的所有实际实现的抽象超类。 Toolkit类的子类用于将各种组件绑定到特定的本机Toolkit实现。
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		//获取封装好的data数据
		Transferable ts = clipboard.getContents(null);
		if (ts != null) {
			// 判断剪贴板中的内容是否支持文本
			if (ts.isDataFlavorSupported(DataFlavor.stringFlavor)) {
				try {
					// 获取剪贴板中的文本内容
					String data = (String) ts.getTransferData(DataFlavor.stringFlavor);
					return data;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	/**
	 * 复制图像到系统粘贴板  (实际上我们不用手绘Image对象直接用File对象得到)
	 * @param path  图片的地址
	 */
	private void copyImage(String path){
		//将path得到的file转换成image
		Image image = null;
		File file = new File(path);
		BufferedImage bi;
		//通过io流操作把file对象转换成Image
		try {
			InputStream is=new FileInputStream(file);
			bi = ImageIO.read(is);
			image=(Image)bi;
		} catch (IOException e) {
			e.printStackTrace();
		}
		//复制到粘贴板上
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //得到系统剪贴板
		Transferable selection = new ImageSelection(image);  //图像通道
		clipboard.setContents(selection, null);
	}
	/**
	 * 得到系统粘贴板上的图片复制到我们项目路径下;
	 * @return 目标Image对象
	 */
	public Image getImage() {
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable ts = clipboard.getContents(null);
		if(ts==null) return null;
		Image image = null;

		if(ts.isDataFlavorSupported(DataFlavor.imageFlavor)) {//这是判断是否支持粘贴图片
			try {
				image = (Image)ts.getTransferData(DataFlavor.imageFlavor);
				System.out.println("可以转换");
			} catch (UnsupportedFlavorException | IOException e) {
				e.printStackTrace();
			}
		}

		//通过我们得到的image转换成BufferedImage对象来写出数据
		BufferedImage bi = (BufferedImage) image;
		bufferedImageToOutputStream(bi);

		return image;
	}
	
	/**
	 * 通过file和BufferedImage 得到一个OutputStream对象来讲数据写入定义好的file对象
	 * @param bufferedimage 我们从image转换来的
	 * @param file 图片.png
	 */
	public void bufferedImageToOutputStream(BufferedImage bufferedimage){
		File file = new File("图片.png");
		if(file.exists()) file.delete();
		try {
			FileOutputStream os = new FileOutputStream(file);
			ImageIO.write(bufferedimage, "png", os);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		ClipboardTest ct = new ClipboardTest();
		//		ct.setClipboardString("666");
		//		System.out.println(ct.getClipboardString());
		ct.copyImage("C:\\Users\\Administrator\\Desktop\\数据结构\\广义表.png");
		ct.getImage(); //我们接收没用,就看file的效果就可以了
		//		System.out.println(System.getProperty("java.class.path"));
	}
}

对于其中涉及到的类的大概作用:

Clipboard类: 此类实现一种使用剪切/复制/粘贴操作传输数据的机制. ClipboardOwner接口: 任何处理剪贴板的类都必须实现该接口.该接口用于剪贴板中的原始数据被替换时发出通知. Dataflavor类:
提供有关数据的元信息,通常用于访问剪切板上的数据。 Transferable接口: 为传输操作提供数据所使用的类的接口
StringSelection类: 实现传输String所需能力的Transferable

以及我们用到的方法功能的大概描述:

.setContents(Transferable contents,ClipOwner owner):将剪切板的内容设置到指定的Transferable对象,并将指定的剪切板所有者作为新内容的所有者注册
Transferable getContents(null):返回表示剪贴板当前内容的 transferable 对象。无则null
boolean isDataFlavorAvailable(DataFlavor flavor):返回是否能够以指定的 DataFlavor 形式提供此剪贴板的当前内容。
Transferable接口:
属性:
stringFlavor:字符串数据
imageFlavor:图片数据

你可能感兴趣的:(java)