2

我正在尝试将 PDF 文件从一个位置复制到另一个位置,但是一旦我运行以下代码,我就无法打开 PDF(它显示以下错误。)

打开此文档时出错。文件已损坏,无法修复

public class BinaryFileTransfer {

    private static String INPUT_FILE = "C:\\Users\\sashwat\\Desktop\\a.pdf";
    private static String OUTPUT_FILE = "C:\\Users\\sashwat\\Desktop\\a-copy.pdf";

    public static void main(String args[]) throws Exception {
        InputStream is = new BufferedInputStream(new FileInputStream(INPUT_FILE));

        OutputStream wos = new BufferedOutputStream(new FileOutputStream(OUTPUT_FILE));

        int len = 0;
        byte[] brr = new byte[1000];
        while ((len = is.read(brr)) != -1) {
            wos.write(brr, 0, len);
        }
    }
}

有人可以帮我看看我到底做错了什么吗?

4

1 回答 1

3

这里的问题是您没有关闭输入/输出流。这是资源泄漏,我在 Windows 机器上重现了您的问题。

从 Java 7 开始,您可以使用try-with-resources语句自动执行此操作:

public static void main(String[] args) throws IOException {
    try (InputStream is = new BufferedInputStream(new FileInputStream(INPUT_FILE));
        OutputStream wos = new BufferedOutputStream(new FileOutputStream(OUTPUT_FILE))) {
        int len = 0;
        byte[] brr = new byte[1000];
        while ((len = is.read(brr)) != -1) {
            wos.write(brr, 0, len);
        }
    }
}

在 try 部分结束时,每个打开的资源都会被关闭。

但是,我强烈建议您开始使用Java NIO.2 API。您可以使用 直接复制文件Files.copy

Files.copy(Paths.get(INPUT_FILE), Paths.get(OUTPUT_FILE));

它也可以采用第三个参数是CopyOption. StandardCopyOption.REPLACE_EXISTING如果目标文件已经存在,一个示例可能会替换它。

于 2016-04-10T12:44:51.900 回答