Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокоментировать часть кода 
:(
    Опции темы
Golovastik
Дата 3.1.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0



Прокоментируйте вот этот код, чего не очень ясен.
Код

String consoleEncoding = System.getProperty("consoleEncoding");
if (consoleEncoding != null) {
    try {
        System.setOut(new PrintStream(System.out, true, consoleEncoding));
    } catch (java.io.UnsupportedEncodingException ex) {
        System.err.println("Unsupported encoding set for console: "+consoleEncoding);
    }
}


Добавлено через 1 минуту и 21 секунду
Переменной под названием consoleEncoding 
мы присваиваем что?
PM MAIL   Вверх
SoulSeeker
Дата 3.1.2011, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 21.7.2008

Репутация: нет
Всего: 2



Цитата

Переменной под названием consoleEncoding 
мы присваиваем что? 

Текущую кодировку консоли системы.

Это сообщение отредактировал(а) SoulSeeker - 3.1.2011, 18:30
PM MAIL WWW   Вверх
Golovastik
Дата 3.1.2011, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0



Обязательно ли конструктору  getProperty  передавать значение строковое consoleEncoding?

Цитата

System.getProperty("consoleEncoding");

Это мы делаем из-за того что переменная типа Стринг названа consoleEncoding?

Это сообщение отредактировал(а) Golovastik - 3.1.2011, 18:44
PM MAIL   Вверх
SoulSeeker
Дата 3.1.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 21.7.2008

Репутация: нет
Всего: 2



Это не конструктор, а статичный метод. Строка "consoleEncoding" -  имя свойства виртуальной машины.
PM MAIL WWW   Вверх
Golovastik
Дата 3.1.2011, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0



То есть мы пишем строку: "consoleEncoding" не из-за того что переменная типа string  названа также?
PM MAIL   Вверх
SoulSeeker
Дата 3.1.2011, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 21.7.2008

Репутация: нет
Всего: 2



Нет, это просто считывание свойства по его названию. Например, как из ini файла. Тут может гуру java-машины подскажут, как там свойства хранятся.  
PM MAIL WWW   Вверх
Golovastik
Дата 3.1.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0



Код

Нет, это просто считывание свойства по его названию. 

Это считывание свойства из класса System по его названию?
то есть в классе System есть объявленное свойство с именем consoleEncoding в который передаётся значение кодировки через метод getProperty?

Это сообщение отредактировал(а) Golovastik - 3.1.2011, 19:47
PM MAIL   Вверх
mgarin
Дата 3.1.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Давайте с начала...
Код
System.getProperty("consoleEncoding")


Через данный вызов, как уже было сказано, происходит считывание значения параметра "consoleEncoding".
Пишите Вы конкретно "consoleEncoding" потому, что вам нужно узнать "кодировку консоли" (кэп, знаю).
Например, если бы вам нужно было узнать версию Java-машины - вы бы сделали вот так: 
Код
System.getProperty ( "java.version" )


Если вы вообще ничего не передадите как параметр (или пустой текст) Вы получите ошибку (еще при компилляции) или же проблемы при исполнении (в виде возврата null как результата, например).

Откуда берется значение для указанного параметра?
Ответ более чем полностью приведен в описании метода:
Код
    /**
     * Gets the system property indicated by the specified key.
     * <p>
     * First, if there is a security manager, its
     * <code>checkPropertyAccess</code> method is called with the key as
     * its argument. This may result in a SecurityException.
     * <p>
     * If there is no current set of system properties, a set of system
     * properties is first created and initialized in the same manner as
     * for the <code>getProperties</code> method.
     *
     * @param      key   the name of the system property.
     * @return     the string value of the system property,
     *             or <code>null</code> if there is no property with that key.
     *
     * @exception  SecurityException  if a security manager exists and its
     *             <code>checkPropertyAccess</code> method doesn't allow
     *              access to the specified system property.
     * @exception  NullPointerException if <code>key</code> is
     *             <code>null</code>.
     * @exception  IllegalArgumentException if <code>key</code> is empty.
     * @see        #setProperty
     * @see        java.lang.SecurityException
     * @see        java.lang.SecurityManager#checkPropertyAccess(java.lang.String)
     * @see        java.lang.System#getProperties()
     */
    public static String getProperty(String key)


Добавлено через 2 минуты и 9 секунд
Т.е. в итоге значение берется из некого системного хранилища/хранилища java-машины.
Могу предположить, что при запуске jvm они все считываются в некую мапу и там хранятся до завершения работы.
PM MAIL WWW ICQ   Вверх
SoulSeeker
Дата 3.1.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 21.7.2008

Репутация: нет
Всего: 2



Цитата(Golovastik @  3.1.2011,  19:41 Найти цитируемый пост)
Это считывание свойства из класса System по его названию?

Опять нет. Свойства не хранятся в коде. Они лежат вне программы - в виртуальной машине и ОС.

Код

Java application programs are executed inside a Java Virtual Machine (JVM), which is in turn executed inside an Operating System (OS). 
From the Java application program point of view, the JVM, together with the OS, represents the computer system. 
The properties of the JVM and the OS are all called system properties. 


Вот тут кратко и понятно: http://www.herongyang.com/Java/System-JVM-...Properties.html

Это сообщение отредактировал(а) SoulSeeker - 3.1.2011, 20:16
PM MAIL WWW   Вверх
Golovastik
Дата 3.1.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0



Код

Через данный вызов, как уже было сказано, происходит считывание значения параметра "consoleEncoding".

А это само свойство находится в классе System? Оно находится в этом классе,в него виндоус отправляет кодировку, которая потом извлекается методом getProperty?

Скажите, а если ОС Линукс, как постатвить условие, что если например в ОС не установлена кодировка CP866 установить её?
Код

if (consoleEncoding != null) //Если переменная consoleEncoding не равна нулю,
 а как она может быть ему равна? 



Это сообщение отредактировал(а) Golovastik - 3.1.2011, 21:32
PM MAIL   Вверх
nc30
Дата 3.1.2011, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Цитата

Прокоментируйте вот этот код

Чтобы у вас не было путаницы, я поменял название переменной (смысл не изменился)
Код

// Попытка прочитать системное свойство с ключом "consoleEncoding" и записать его значение
// в переменную consEnc
// Если системного свойства с таким ключом не существует, то метод getProperty() вернет null
String consEnc = System.getProperty("consoleEncoding");
// Если такое свойство существует...
if (consEnc != null) {
    try {
        // Попытка переопределить стандартный поток вывода System.out,
        // используя для его создания название символьной кодировки из перем-й consEnc
        System.setOut(new PrintStream(System.out, true, consEnc));
    } catch (java.io.UnsupportedEncodingException ex) {
        System.err.println("Unsupported encoding set for console: "+consEnc);
    }
}


Golovastik, кстати, вывести полный список системных свойств довольно легко. Поместите в ваш код следующие строки:
Код

        // Получаем таблицу значений всех свойств
        Properties props = System.getProperties();
        // Получаем набор имен (ключей) всех свойств
        Set<String> propNames = props.stringPropertyNames();
        // Проходим по множеству ключей, вытаскивая из таблицы соответствующие ключам значения свойств и печатаем их
        for (String key: propNames) {
            System.out.println(key + ": " + props.getProperty(key));
        }


Видимо, идея автора приведенного вами кода была в смене кодировки стандартного потока вывода на другую. Например, чтобы метод System.out.println() делал вывод в иной кодировке (значение которой, как предполагается, задано свойством с именем consoleEncoding). 

Цитата

Код

if (consoleEncoding != null) //Если переменная consoleEncoding не равна нулю,
 а как она может быть ему равна? 


У себя в WinXP я свойства с таким ключом не нашел. Поэтому в моем случае как-раз таки возвращается null. Может быть в Linux есть свойство с таким именем. Как проверить? См. выше про печать списка свойств.


PM MAIL   Вверх
Golovastik
Дата 3.1.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0



Попробовал сделать русский ввод, не получается, только вывод русский, как сделать ввод ан русском языке?
Код

package javaapplication3;
import java.io.*;

class Main{
public static void main(String[] args) throws Exception{
System.setOut(new PrintStream(System.out,true,"Cp866"));
    BufferedReader obj = new BufferedReader(new InputStreamReader(System.in));
    String str;
    System.out.println("Введите текст");
    str = obj.readLine();
    System.out.println("Вы ввели: "+str);
}
 }



Результат:
Код

Введите текст
привет
Вы ввели: ЇаЁў?в

PM MAIL   Вверх
Temdegon
Дата 3.1.2011, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Потому что нужно указать кодировку ввода.
Цитата

BufferedReader obj = new BufferedReader(new InputStreamReader(System.in, "cp1251"));

Какую именно кодировку указывать - я не знаю. 
Если запускаю из нетбинса, то все правильно отображает с такими настройками:
Код

System.setOut(new PrintStream(System.out,true,"UTF-8"));
BufferedReader obj = new BufferedReader(new InputStreamReader(System.in, "cp1251"));

Если запустить из виндовой консоли - то отображает криво.
Как ее правильно определить в рантайме, что бы работало везде и всегда - понятия не имею. Буду благодарен за подсказку.
PM MAIL   Вверх
nc30
Дата 4.1.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Спасибо Skipy за ряд хороших статей посвященных вводу-выводу, кодировкам и т. п.

Это сообщение отредактировал(а) nc30 - 6.1.2011, 07:58
PM MAIL   Вверх
Golovastik
Дата 6.1.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: 1
Всего: 0




Вот так тоже не хочет, вводить русским в командной строке.
 
Код

System.setIn(new PrintStream(System.in,true,"Cp866"));

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.