Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу с помощью утилиты wmic и потом с них форматирует отчет на рабочий стол.
Программа в общем-то ничего сложного не делает, обычная работа с файлами и текстом, если упростить, но проблема в том, что при чтении файла (в файле точно не UTF-8, word определил кодировку, как Юникод) поэтому геморрой с обработкой информации, с этим я в общем-то справился, вот только на ноутах она выдает дичь, где используется кириллица.
К слову к примеру если в строку я записываю кириллицу сам, то всё ок. Проблема только с файлом. Вот 1 из методов.
void networkAdapterGet() {
StringBuilder result = new StringBuilder();
try(BufferedReader reader = new BufferedReader(new FileReader(NETWORK_ADAPTER_INFO_PATH));
BufferedWriter writer = new BufferedWriter(new FileWriter(TEMP_RESULT_FILE_PATH, true))) {
line = reader.readLine();
while (line != null){
if (line.length() > 1){
line = trimSpaces(line);
line = networkAdapterProcessing(line);
if (!line.equals("")){
result.append(line);
result.append(lineSeparator);
}
}
line = reader.readLine();
}
writer.write("Сетевые устройства:");
writer.write(lineSeparator);
writer.write(result.toString());
writer.write(lineSeparator);
writer.write(lineSeparator);
} catch (IOException e) {
e.printStackTrace();
}
}
Скорее всего зря повелся наFileReader/Writer и думаю основная проблема, как раз таки в Reader'е. Пошаманил с кодировками на открытии и получил фигу, упало как раз таки из-за несовпадения кодировок, можно конечно перебрать вариантов там пара всего, но хотелось бы узнать можно ли как-то это дело исправить. Это пока единственный мешающий/раздражающий баг на данном этапе разработки утилитки.
Нужно писать в той кодировке, которая читается клиентом. Чтобы указать кодировку надо заменить FileWriter на
new OutputStreamWriter(new FileOutputStream(TEMP_RESULT_FILE_PATH), StandardCharsets.UTF_8);
если кодировка UTF_8 не подходит, то можно попробовать KOI-8 или CP1251, или другая кодировка, которая поддерживает кирилицу, например CP866.
Очень помог ответ, Roman C. Получилась немного громоздкая конструкция со всеми этими обертками, но вроде бы работает осталось поправить другой метод, а именно networkAdapterProcessing(), чтобы корректно отображался результат, да и остальные методы можно оставить без изменений потому, что проблема только в сетевых устройствах, но вот решение самой проблемы с кодировками получилась весьма интересной хотя бы для меня, я еще пока только учусь.
try(BufferedReader reader =
new BufferedReader(
new InputStreamReader(
new FileInputStream(NETWORK_ADAPTER_INFO_PATH), "Unicode"));
BufferedWriter writer =
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(TEMP_RESULT_FILE_PATH, true), "Unicode"))){
Так вот для того, чтобы определить кодировку достаточно было открыть файл клятым блокнотом и жамкнуть "Сохранить как", чтобы убедиться в том, что это Юникод. Причем пробовал вначале пересохранить в UTF-8, но там была полная борода. Сейчас конечно из-за того, что открывает с помощью другого инструмента сменилась и сама структура получаемой строки немного, но это уже мелочи по сравнению с раздражающей меня ошибкой с кодировкой. Как это у меня обычно и бывает проблема была в сути своей совсем не сложной, но мозги она заклинила неслабо. В будущем думаю исправлю, чтобы было все одинаково и не выделялось, но пока надо сделать хотя бы это. Спасибо вам за помощь.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости