вторник, 22 сентября 2009 г.

Русские буквы в файлах *.property

Вот встала проблема. Русский текст из файла property считывался кракозябрами.Google выдал следующие:

Русские буквы в файлах properties
Для чтения файлов properties используются методы загрузки ресурсов, которые работают специфичным образом. Собственно для чтения используется метод Properties.load, который не использует file.encoding (там в исходниках жёстко указана кодировка ISO-8859-1), поэтому единственный способ указать русские буквы — использовать формат \uXXXX и утилиту native2ascii.
Метод Properties.save работает по разному в версиях JDK 1.1 и 1.2. В версиях 1.1 он просто отбрасывал старший байт, поэтому правильно работал только с англицкими буквами. В 1.2 делается обратное преобразование в \uXXXX, так что он работает зеркально к методу load.
Если файлы properties у вас загружаются не как ресурсы, а как обычные файлы конфигурации, и вас не устраивает такое поведение — выход один, написать собственный загрузчик.
Русские буквы и не только

 Не сильно отчаявшись, появилось решение. Используем inputStreamReader:

            final Properties settings = new Properties();
            FileInputStream in = null;
            InputStreamReader inR = null;
            try {
                in = new FileInputStream("config/welcome.properties");
                inR = new InputStreamReader(in, "UTF-8");
            } catch (UnsupportedEncodingException ex) {
                ...
            } catch (FileNotFoundException ex) {
                ...
            }
            try {
                settings.load(inR);
            } catch (IOException ex) {
                ...
            }

1 комментарий:

  1. Еще удобный момент пока не потерял:

    final File conff = new File(filePath);
    String str = "";
    try (FileInputStream fis = new FileInputStream(conff); Scanner s = new Scanner(new InputStreamReader(fis, "UTF-8"))) {
    while (s.hasNextLine()) {
    final String line = s.nextLine().trim();
    str += line;
    }
    } catch (IOException ex) {
    System.err.println(ex);
    throw new RuntimeException(ex);
    }

    ОтветитьУдалить