Невозможно скопировать файл PDF с помощью FileInputStream

Я пытаюсь скопировать 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);
        }
    }
}

Может ли кто-нибудь помочь мне, что именно я делаю неправильно?


person Keen Sage    schedule 10.04.2016    source источник
comment
Файлы имеют одинаковый размер после завершения копирования?   -  person Alejandro Goñi    schedule 10.04.2016


Ответы (1)


Проблема здесь в том, что вы не закрываете потоки ввода/вывода. Это утечка ресурсов, и я воспроизвел вашу проблему на компьютере с 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);
        }
    }
}

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

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

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

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

person Tunaki    schedule 10.04.2016