
Чтение файлов с помощью потоков ввода/вывода производится по 1 байту. Для небольших файлов это работает вполне неплохо, но при обработке файлов даже в несколько мегабайт процесс начинает занимать очень много времени, а нагрузка на систему возрастает. Для ускорения чтения/записи нужно использовать буферизованные версии методов read() и write(), принимающих в качестве входного параметра массив байт.
try (InputStream is = new FileInputStream("book.pdf");
OutputStream os = new FileOutputStream("book_copy.pdf")) {
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace(System.out);
}