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));

である 3 番目の引数を取ることもできますCopyOption。例としてStandardCopyOption.REPLACE_EXISTING、ターゲット ファイルが既に存在する場合にそれを置き換えるものがあります。

于 2016-04-10T12:44:51.900 に答える