2016-04-10 22 views
1

Ich versuche, eine PDF-Datei von 1 Ort zu einem anderen zu kopieren, aber sobald ich den folgenden Code ausführen, ich bin nicht in der Lage, die PDF zu öffnen (es wird folgende Fehler angezeigt wird.)Unable PDF-Datei kopieren Sie mit Fileinputstream

Beim Öffnen dieses Dokuments ist ein Fehler aufgetreten. Die Datei ist beschädigt und nicht

repariert werden konnte
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); 
     } 
    } 
} 

Kann mir jemand helfen, was genau mache ich falsch?

+0

Die Dateien haben die gleiche Größe, sobald die Kopie fertig ist? –

Antwort

3

Das Problem hier ist, dass Sie die Eingabe/Ausgabe-Streams nicht schließen. Dies ist ein Ressourcenverlust und ich habe Ihr Problem auf einem Windows-Rechner reproduziert.

Beginnend mit Java 7, können Sie die try-with-resources Anweisung verwenden, die automatisch zu tun:

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

Am Ende des try Teil, jede geöffnete Ressource wird geschlossen.

Ich schlage jedoch vor, dass Sie beginnen, die Java NIO.2 API zu verwenden. Sie können eine Datei direkt mit Files.copy kopieren.

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

Es kann auch ein drittes Argument, das CopyOption ist. Ein Beispiel könnte StandardCopyOption.REPLACE_EXISTING sein, das die Zieldatei ersetzt, wenn sie bereits existiert.