Как добавить строку utf-8 в файл свойств

Как добавить строку utf-8 в файл свойств. Я привел код ниже.

public  static void addNewAppIdToRootFiles() {
Properties properties = new Properties();       
   try {
       FileInputStream fin = new FileInputStream("C:\Users\sarika.sukumaran\Desktop\root\root.properties");
       properties.load(new InputStreamReader(fin, Charset.forName("UTF-8")));
       String propertyStr = new String(("قسيمات").getBytes("iso-8859-1"), "UTF-8");
       BufferedWriter bw = new BufferedWriter(new FileWriter(directoryPath + rootFiles, true));
       bw.write(propertyStr);
       bw.newLine();
       bw.flush();
       bw.close(); 
       fin.close();           

   } catch (Exception e) {
       System.out.println("Exception : " + e);
   }
} 

Но когда я открываю файл, строка, которую я написал "قسيمات", отображается как "??????". Пожалуйста помогите.


person Sarika.S    schedule 09.01.2012    source источник
comment
А в чем твоя проблема?   -  person AlexR    schedule 09.01.2012
comment
@AlexR: Когда я записываю в файл строку قسيمات, она будет записана как ??????   -  person Sarika.S    schedule 09.01.2012
comment
Эти строки в вашем коде BufferedWriter bw = new BufferedWriter (new FileWriter (directoryPath + rootFiles, true)); bw.write (свойствоStr); делают работу за вас? есть ли у вас исключение?   -  person Rajesh Pantula    schedule 09.01.2012
comment
Вы проверяли, установлено ли для вашего системного свойства file.encoding значение UTF-8?   -  person PhilW    schedule 09.01.2012
comment
@AlexR: Я отредактировал код своего вопроса. Теперь вы легко можете понять, что я имел в виду. Без исключения.   -  person Sarika.S    schedule 09.01.2012
comment
@PhilW: при создании нового файла с этой строкой он работает правильно. Но я хочу добавить строку utf-8 в существующий файл.   -  person Sarika.S    schedule 09.01.2012
comment
Вы просматриваете выходной файл с помощью редактора, который понимает UTF-8? Вы пытались прочитать значение через properties.load()?   -  person Bohemian♦    schedule 09.01.2012
comment
_1 _... Почему вы преобразовали арабскую строку в iso-8859-1 (ISO Latin 1), который не поддерживает арабские кодовые точки? htmlhelp.com/reference/charset ... Просто используйте getBytes(), который вернет правильные точки кода Unicode для арабской строки ...   -  person ee.    schedule 09.01.2012
comment
@Bohemian: Я тоже пробовал это. Но никак.   -  person Sarika.S    schedule 09.01.2012
comment
@ee: Я пробовал. Но без изменений :(   -  person Sarika.S    schedule 09.01.2012
comment
Хорошо .. ваш входной root.properties файл действительно в кодировке UTF-8, поскольку вы сделали предположение, используя Charset.forName("UTF-8"), чтобы открыть его? Если создается новый файл, просто используйте properties.load(new InputStreamReader(fin));, чтобы новый файл обрабатывался как файл в кодировке Unicode.   -  person ee.    schedule 09.01.2012
comment
В противном случае я подозреваю, что ваш текстовый редактор использует неправильный шрифт, поддерживающий арабский код в Unicode. Но обычно неправильный шрифт создает прямоугольные поля вместо нескольких? В зависимости от реализации глифа шрифта редактора.   -  person ee.    schedule 09.01.2012
comment
@ee: Любое другое решение? При создании нового файла он работает правильно (Writer out = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (fileDir), UTF-8))) ;. Но мне нужно добавить.   -  person Sarika.S    schedule 09.01.2012
comment
Я не понимаю; что вы имеете в виду под Bit Ineed to append? Или вы имеете в виду Bit I need to append?   -  person ee.    schedule 09.01.2012
comment
Это должен быть UTF-8, а не UTF8 ...   -  person ee.    schedule 09.01.2012
comment
@ee: Это проблема не только для арабского языка. Прости! Я ошибся при наборе текста.   -  person Sarika.S    schedule 09.01.2012
comment
Я проверю это еще раз по дороге домой, если никто не сможет убедительно объяснить вашу проблему.   -  person ee.    schedule 09.01.2012


Ответы (2)


Хорошо, ваша первая ошибка - getBytes("iso-8859-1"). Ни в коем случае не следует делать эти манипуляции. Если вы хотите записать текст в формате Unicode в файл, вы должны открыть файл и написать текст. Внутреннее представление строк в java - unicdoe, поэтому все будет написано правильно.

Когда вы читаете файл, вам нужно позаботиться о кодировке. Кстати, вы делаете это правильно.

Но вам не нужно использовать инструменты для работы с файлами, чтобы добавить что-то в файл свойств. Вы можете просто позвонить prop.setProperty("yourkey", "yourvalue"), а затем позвонить prop.store(new FileOutputStream(youfilename)).

person AlexR    schedule 09.01.2012
comment
(yourkey, yourvalue) означает? - person Sarika.S; 09.01.2012
comment
это просто пример ... в вашем случае это должно быть prop.setProperty("قسيمات", "whatever");, поэтому он будет писать قسيمات=whatever в файле свойств youfilename, даже если арабский язык идет справа налево (RTL) при вызове prop.store(new FileOutputStream(youfilename)); - person ee.; 09.01.2012
comment
@Alex, ee: Свойства properties = new Properties (); properties.setProperty (سيمات, ааааа); properties.store (новый FileOutputStream (directoryPath + rootFiles),); Это имело в виду? Но у меня это не работает. - person Sarika.S; 09.01.2012
comment
Также я потерял все свойства, установленные для файла. Есть ли возможность установить UTF-8 для объекта FileWriter? - person Sarika.S; 09.01.2012

Хорошо, я проверил спецификацию Свойства класс. Если вы используете следующие методы: load() для входного потока или store() для выходного потока, поток ввода / вывода для файла предполагается кодировкой iso-8859-1 по умолчанию. Таким образом, вы должны быть осторожны с некоторыми вещами:

Некоторые символы на французском, немецком и португальском языках совместимы с iso-8859-1 (Latin1), что нормально работает в iso-8859-1. Так что вам не о чем сильно беспокоиться. Но другие символы, такие как арабские и ивритские символы, не совместимы с Latin1, поэтому вам нужно быть осторожным с выбором кодировки для этих символов. Если у вас есть сочетание символов французского и арабского языков, у вас нет другого выбора, кроме как использовать Unicode.

Какова кодировка вашего текущего входного файла, если он уже существует для использования с методом load() в Properties? Если это не iso-8859-1 по умолчанию, то вам нужно сначала выяснить, что это такое, прежде чем открывать файл. Если infile кодировка файла - UTF-8, используйте properties.load(new InputStreamReader(new FileInputStream("infile"), "UTF8"))); Затем придерживайтесь этой кодировки до конца. Также сопоставьте кодировку файла с кодировкой символов.

Если это новый входной файл, который будет использоваться с методом load() в Properties, выберите кодировку файла, которая работает с кодировкой вашего символа. Затем придерживайтесь этой кодировки до конца.

Ожидаемая кодировка выходного файла должна быть такой же, как и в методе load() в Properties, перед тем как использовать метод store(). Если это не iso-8859-1 по умолчанию, то вам нужно сначала выяснить, что это такое, прежде чем сохранять файл. Придерживайтесь этой кодировки до конца. Также сопоставьте кодировку файла с кодировкой символов. Если outfile кодировка файла - UTF-8, тогда используйте кодировку UTF-8 при сохранении файла. Но если метод store() по-прежнему заканчивается файлом в кодировке iso-8859-1, тогда вам нужно сделать то, что предлагается дальше ...

Если вы будете придерживаться стандартного стандарта iso-8859-1, он отлично подойдет для таких символов, как французский. Но если символы несовместимы с кодировкой iso-8859-1 или Latin1, вам нужно вместо этого использовать escape-символы Unicode в качестве альтернативы: например: \uFE94 для арабского символа . Для меня это экранирование слишком утомительно, и обычно мы используем утилиту native2ascii, предоставленную в JRE или JDK, для преобразования файла свойств из одной кодировки в другую. Конечно, есть и другие способы ... просто проверьте ссылки ниже ... Для меня лучше использовать файл свойств в формате XML, поскольку по умолчанию это UTF-8 ...

Использованная литература:

person ee.    schedule 09.01.2012