Ошибка, которую вы видели, была специальным символом в виде двухбайтовой последовательности UTF-8, но каждый (специальный UTF-8) байт интерпретировался как однобайтовая кодировка по умолчанию, но с отсутствующим значением, следовательно, дважды ?
замена.
Следовательно:
BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in));
String[] stdinData = readLines(stdinReader);
printToFile(stdinData, "stdin_out.txt");
Path path = Paths.get("testinput-utf8.txt");
List<String> lines = Files.readAllLines(path); // Here the default is UTF-8!
Path path = Paths.get("testinput-winlatin1.txt");
List<String> lines = Files.readAllLines(path, "Windows-1252");
Files.write(lines, Paths.get("file_out.txt"), StandardCharsets.UTF_8);
Чтобы проверить, поддерживает ли ваша текущая компьютерная система японский язык:
System.out.println("Hiragana letter Wo '\u3092'."); // Either を or ?.
Видя ?
преобразование в кодировку системы по умолчанию не смог доставить. を - это U + 3092, u-кодированный как ASCII с \ u3092.
Чтобы создать текст UTF-8 под Windows:
Files.write(Paths.get("out-utf8.txt"),
"\uFEFFHiragana letter Wo '\u3092'.".getBytes(StandardCharsets.UTF_8));
Здесь я использую уродливый (обычно ненужный) маркерный символ спецификации \uFEFF
(пробел нулевой ширины), который позволит блокноте Windows распознавать текст в UTF-8.