使用Transferable将文件流写入到系统剪贴板后,剪贴板中的文件实际上只是文件的引用,并没有实际拷贝文件到剪贴板中。因此,当删除原始文件后,剪贴板中的文件引用也将失效,无法粘贴到其他位置。

如果您希望实现将文件内容拷贝到剪贴板中,并能在文件被删除后仍然能够粘贴到其他位置,可以尝试以下方法:

  1. 将文件内容读取到内存中,然后使用Transferable将文件内容拷贝到剪贴板中,而不是直接使用文件流。这样无论文件是否被删除,剪贴板中的内容仍然有效。

  2. 在将文件内容写入到剪贴板之前,先将文件拷贝到一个临时文件中,然后使用Transferable将临时文件写入到剪贴板中。这样即使原始文件被删除,剪贴板中的临时文件仍然可用。

以下是使用第一种方法的示例代码:

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.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ClipboardExample {
    public static void main(String[] args) {
        File file = new File("path/to/file.txt");

        // 读取文件内容到内存中
        byte[] fileContent = readFileContent(file);

        // 将文件内容拷贝到剪贴板中
        copyFileContentToClipboard(fileContent);

        // 从剪贴板粘贴文件内容到指定位置
        byte[] clipboardContent = pasteFileContentFromClipboard();
        saveFileContent(clipboardContent, new File("path/to/destination.txt"));
    }

    private static byte[] readFileContent(File file) {
        try (FileInputStream fis = new FileInputStream(file);
             ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
            return bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static void copyFileContentToClipboard(byte[] fileContent) {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable transferable = new Transferable() {
            @Override
            public DataFlavor[] getTransferDataFlavors() {
                return new DataFlavor[]{DataFlavor.stringFlavor};
            }

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

            @Override
            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
                if (flavor.equals(DataFlavor.stringFlavor)) {
                    return new String(fileContent);
                }
                throw new UnsupportedFlavorException(flavor);
            }
        };
        clipboard.setContents(transferable, null);
    }

    private static byte[] pasteFileContentFromClipboard() {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable transferable = clipboard.getContents(null);
        if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
            try {
                String fileContent = (String) transferable.getTransferData(DataFlavor.stringFlavor);
                return fileContent.getBytes();
            } catch (UnsupportedFlavorException | IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private static void saveFileContent(byte[] fileContent, File destFile) {
        try (FileOutputStream fos = new FileOutputStream(destFile);
             ByteArrayInputStream bis = new ByteArrayInputStream(fileContent)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

请注意,这只是一种简单的示例,并未处理异常情况和错误处理。在实际使用中,您可能需要根据具体需求进行适当的修改和完善

java 使用Transferable将文件流写入到系统剪切板后删除文件后剪贴板里的文件也没了无法粘贴到其他位置

原文地址: https://www.cveoy.top/t/topic/hXK7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录