Добавление файла в сервлет - PullRequest
1 голос
/ 10 января 2012

Следующий код добавляет данные к данному файлу в приложении Java. Но когда поместить этот код в сервлет, файл становится пустым. Почему это?

try {            
  OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("C:\\root.properties", true), "UTF-8");
  BufferedWriter fbw = new BufferedWriter(writer);
  String s = "root.label.1130.2=قسيمات";      
  fbw.write(new String(s.getBytes("iso-8859-1"), "UTF-8"));
  fbw.newLine();
  fbw.close();
} catch (Exception e) {
  System.out.println("Error: " + e.getMessage());
} 

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Строка содержит символы, отличные от ISO-8859-1, после знака равенства.Вы можете проверить, что компиляция Java принимает ввод UTF-8, т.е. javac -encoding UTF-8.Кроме того, замените «iso-8859-1» на «UTF-8» в getBytes().

. См. http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_sourcefiles, где вы найдете хорошую запись и другие способы кодирования константной строки.

1 голос
/ 10 января 2012

Вы уверены, что видите какое-либо исключение, которое может быть выдано?Возможно, ваш сервлет не имеет разрешения на запись в файл.Я попытался бы отладить вашу программу, чтобы увидеть, что происходит при запуске этого кода.


То, что вы делаете, повредит многие символы, но вы все равно должны получить файл.

Когда я запускаю этот код, я получаю файл с

root.label.1130.2=??????

, который вы ожидаете получить.

Если я запускаю этот код

PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("root.properties", true), "UTF-8"));
String s = "root.label.1130.2=قسيمات";
pw.println(s);
pw.close();

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("root.properties"), "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
    for (int i = 0; i < line.length(); i++) {
        char ch = line.charAt(i);
        if (ch >= ' ' && ch < 127)
            System.out.print(ch);
        else
            System.out.printf("\\u%04x", (int) ch);
    }
    System.out.println();
}

печатаетниже показано, что арабские символы не были искажены.

root.label.1130.2=\u0642\u0633\u064a\u0645\u0627\u062a

файл теперь содержит

root.label.1130.2=قسيمات

, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...