Вы читаете байты (каждый в целое число).
A String
, однако, не является массивом байтов, но содержит текст Unicode и может комбинировать греческий, китайский и любой другой. (На самом деле String
использует char
с, где каждый символ равен двум byte
с.) Существует преобразование для внешних байтов, имеющих некоторую кодировку кодировки. Это пойдет не так, использует больше памяти и медленно. Следовательно, здесь обычно не используется строка.
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while((b = in.read()) !=-1) {
b = (b + key) % 256;
out.write(b);
}
in.close();
byte[] data = out.toByteArray();
FileOutputStream out2 = new FileOutputStream(file);
out2.write(data);
out2.close();
Другая проблема заключается в том, что байты имеют диапазон 0–255 (или байты со знаком -128–127).
Отсюда мой %
по модулю. каждый видит & 0xFF
тоже (побитовое И с 255, 0b1111_1111).
Обратите внимание, что println(someInt)
запишет текстовое представление в виде целого числа, 'A', будучи int 65, будет сохранено как "65" - до 2 байтов: 56 и 55.