Safe Кодирование Конструкторы
Получение Java правильно уведомить вас об ошибках кодирования является сложным.Вы должны использовать наиболее многословным и, увы, в мере используется из четырех альтернативных contructors для каждого из InputStreamReader
и OutputStreamWriter
получить надлежащее исключение на кодирующего глюк.
Для файла I/O, всегда убедитесь, что всегда использовать в качестве второго аргумента, как OutputStreamWriter
и InputStreamReader
фантазии аргумент кодировщик:
Charset.forName("UTF-8").newEncoder()
Есть другие даже более причудливые возможности, но ни один из трех проще возможности работы для обработки исключений. Они делают:
OutputStreamWriter char_output = new OutputStreamWriter(
new FileOutputStream("some_output.utf8"),
Charset.forName("UTF-8").newEncoder()
);
InputStreamReader char_input = new InputStreamReader(
new FileInputStream("some_input.utf8"),
Charset.forName("UTF-8").newDecoder()
);
Что касается работы с
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
Проблема в том, что это не будет использовать полный кодер формы аргументов для потоков характер, и поэтому вы снова пропустите проблемы с кодировкой.
длинного пример
Вот уже пример, это один управляющий процессом вместо файла, где мы продвигаем два различных входные байты потоков и один выходной поток байт все в UTF-8 символьных потоки с полной обработкой исключений:
// this runs a perl script with UTF-8 STD{IN,OUT,ERR} streams
Process
slave_process = Runtime.getRuntime().exec("perl -CS script args");
// fetch his stdin byte stream...
OutputStream
__bytes_into_his_stdin = slave_process.getOutputStream();
// and make a character stream with exceptions on encoding errors
OutputStreamWriter
chars_into_his_stdin = new OutputStreamWriter(
__bytes_into_his_stdin,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newEncoder()
);
// fetch his stdout byte stream...
InputStream
__bytes_from_his_stdout = slave_process.getInputStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stdout = new InputStreamReader(
__bytes_from_his_stdout,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
// fetch his stderr byte stream...
InputStream
__bytes_from_his_stderr = slave_process.getErrorStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stderr = new InputStreamReader(
__bytes_from_his_stderr,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
Теперь у вас есть три символа потоки, которые все поднимают исключение на ошибки кодирования, соответственно называемых chars_into_his_stdin
, chars_from_his_stdout
и chars_from_his_stderr
.
Это немного сложнее, чем то, что вам нужно для вашей проблемы, решение которой я дал в первой половине этого ответа. Ключевым моментом является то, что это единственный способ обнаружить ошибки кодирования.
Только не заводи меня меня зовут PrintStream
s есть исключения.
Этого недостаточно , Вам также нужен «InputStreamReader (InputStream in, CharsetDecoder dec)», так что последним аргументом является «Charset.forName (« UTF-8 »). NewDecoder()'. – tchrist
Ошибки входного кодирования будут тихо опущены, если вы это сделаете. – tchrist
Кодер не нужен. Конструктор принимает либо строку, либо кодировку, либо кодировщик в обоих классах ввода/вывода. Не уверен, что вы подразумеваете под своим комментарием. Можете ли вы уточнить, пожалуйста? –