Хотя в вашей программе есть несколько вещей, которые можно улучшить, ни одна из них не является причиной, по которой вы видите китайские иероглифы. На самом деле ваша программа, кажется, работает нормально, и полученный файл фактически содержит текст, который вы видели при попытке использовать System.out.println
.
. Я скопировал ваш выходной пример, вставил его в новый файл, используяБлокнотом и после сохранения посмотрел файл с помощью HEX-редактора (здесь HxD). Шестнадцатеричные данные начинаются так: FF FE 41 3A 20 31 35 42 ... который "переводит" в ÿþA: 15B...
. Это именно ваш ожидаемый результат плюс спецификация байта (Byte Order Marker), которая была создана Notepad при сохранении файла и поэтому не является частью исходных данных.
Так почему вы видите странный результат? Причина - не ваша программа, а средство просмотра текста, которое вы используете. Многие из них пытаются сделать обоснованное предположение, если файл пропускает спецификацию, чтобы решить, следует ли (в случае Windows Notepad) файл читать с cp1252 (Windows Latin-1), UTF-8 или Unicode / UTF-16. Существуют разные алгоритмы, поэтому трудно сказать, почему ваш зритель решил, что это может быть UTF-16, но это так; -)
У меня есть предположение, и решение вашей проблемы может заключаться в изменении
fw.write(((char)(i + 'A')) + ": " + count[i]);
до
fw.write(((char)(i + 'A')) + ": " + count[i] + "\r\n");
В качестве альтернативы запишите файл, используя набор символов, который включает в себя спецификацию, например, UTF-8 или UTF-16. С Java 11 вы можете сделать это непосредственно с FileWriter
(есть новый конструктор, который позволяет установить это), если вам нужно использовать более старую версию Java, вам нужно использовать OutputStreamWriter
:
OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(file2), "UTF8");
Также: проверьте средство просмотра текста, если -диалог «Открыть файл» позволяет вам явно указать Charset, Notepad в немецкой системе Windows вызывает опцию «Codierung», а «ANSI» - это «cp1252» (кодировка вашего Java)Виртуальная машина должна была использоваться при использовании FileWriter
без определенной кодировки).