Код:
InputStream inputStream = Files.newInputStream(Path.of("file1.txt"));
 //В file 1 находится текст "АБВГД".
 OutputStream outputStream = Files.newOutputStream(Path.of("file2.txt"));
 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
 // 1 вариант
 while (bufferedReader.ready()) {
    outputStream.write(bufferedReader.read());
 }
 // 2 вариант
 byte[] array = new byte[1024];
 while (inputStream.available() > 0) {
     int len = inputStream.read(array);
     outputStream.write(array,0,len);
}
Вопрос по варианту 1: Логика переменной bufferedReader в обертывании inputStream в InputStreamReader, который читает char из потока byte, затем обертываем в BufferedReader, сохраняя в массив char {А,Б,В,Г,Д}. Затем записываем в file2 по одному байту из массива bufferedReader. Получается, что мы берем, например букву А, отбрасываем от нее 24 бита и получаем в итоге число 16, которое =  в UTF-8 и такой результат появляется в file2. Хотя в файле немного другое представление, но не суть. В принципе, все понятно, но вопрос, как тогда записать как надо? Я подумал, что раз у нас есть InputStreamReader, то наверное необходимо обернуть outputStream в OutputStreamWriter и уже через него из bufferedReader записать в file2, чтоб получить нормальное представление русских букв, но там в итоге лишь пустой file2. Никакого эффекта. Я понимаю, что скорее всего, этот вариант кажется безумным и если покопаться в этих классах потоков, можно будет сделать все проще, но интересно, как записать через BufferedReader? Вопрос по варианту 2: В этом варианте все работает замечательно. Однако мне стало интересно, каким образом, все записывается в byte, если байт лишь до 127, а у русской А в символьном представлении = 1040. В итоге, через дебагер, глянул, какие значения сохраняются в массиве и вот результат: Во первых, числа отрицательные, ну да ладно. -48, как мне кажется, это либо обозначение, что работа идет с русскими буквами, либо просто номер строки или чего-то подобного, где они находятся(все это офк предположение). То есть, при записи, в этом варианте outputStream.write записывает в file2 значения, скажем так, группируя первый и второй байты. Так вот, почему числа отрицательные, действует какое-то переполнение или что? Почему запись работает нормально и для записи русских букв метод считывает 2 числа типа байт, в то время, как если бы у нас были в первом файле значения {A,B,C,D,E}, то в таком случае, в массиве было бы нормальное представление этих букв в UTF-8, то есть 65, 66, 67... Спасибо!