Код:
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...
Спасибо!