2016-04-10 8 views
1

Я пытаюсь скопировать PDF-файл из одного места в другое, но как только я запустил следующий код, я не могу открыть PDF (он показывает следующую ошибку.)Невозможно скопировать файл PDF с помощью FileInputStream

Ошибка при открытии этого документа. Файл поврежден и не может быть отремонтирован

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.

Начиная с 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); 
     } 
    } 
} 

В конце Ьгу части, каждый ресурс открыт будет закрыт.

Однако я настоятельно рекомендую вам начать использовать API Java NIO.2. Вы можете скопировать файл напрямую с Files.copy.

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

Он также может принимать 3-й аргумент CopyOption. Примером может быть StandardCopyOption.REPLACE_EXISTING, который заменяет целевой файл, если он уже существует.