2016-04-10 29 views
1

1つの場所から別の場所にPDFファイルをコピーしようとしていますが、次のコードを実行すると、PDFを開くことができません(次のエラーが表示されます)。FileInputStreamを使用して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); 
     } 
    } 
} 

を修復することができませんでしたか?

+0

コピーが完了すると、ファイルのサイズは同じですか? –

答えて

3

ここでの問題は、入出力ストリームを閉じることではないということです。これはリソースリークであり、Windowsマシンで問題を再現しました。あなたが自動的にそれを行うためにtry-with-resources文を使用できるJava 7以降で

は、:

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

トライ部分の終わりに、開かれた各リソースが閉じられます。

ただし、Java NIO.2 APIを使用することを強くお勧めします。 Files.copyで直接ファイルをコピーできます。

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

CopyOptionという3つ目の引数も使用できます。ターゲットファイルが既に存在する場合、そのファイルを置き換える例がStandardCopyOption.REPLACE_EXISTINGである可能性があります。

関連する問題