Программирование. Программирование на Java Конспект лекций (ИТМО 2010). Справочник по языку Java и может использоваться как конспект лекционного курса Системы программирования Интернетприложений
Скачать 0.85 Mb.
|
39 Методы: public int length() длина строки в буфере public char charAt(int index) символ в заданной позиции public int capacity() размер буфера public StringBuffer append(…) добавление в конец буфера public StringBuffer insert(…) вставка в буфер public StringBuffer reverse() инверсия строки public void setCharAt(int i, char c) установка символа в заданной позиции public String toString() преобразование в строку Использование String и StringBuffer class ReverseString { public static String reverse(String source) { int i, len = source.length(); StringBuffer dest = new StringBuffer(len); for (i = (len - 1); i >= 0; i--) { dest.append(source.charAt(i)); } return dest.toString(); } } Все строковые константы в Java имеют тип String . Оператор + для объектов типа String выполняет операцию соединения (конкатенации). Если в выражении присутствует хотя бы один объект типа String , остальные объекты преобразуются в String с помощью метода toString() Класс StringTokenizer Используется для разбиения строки на лексемы. Конструкторы: public StringTokenizer(String string) public StringTokenizer(String string, String delimiters) Методы: public boolean hasMoreTokens(); public String nextToken(); public String nextToken(String newDelimiters); 40 Пример: String sentence = "It's a sentence, it can be tokenized."; StringTokenizer st = new StringTokenizer(sentence, " ,.!?;-\n\r"); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } Интернационализация Интернационализация - это процесс создания приложений таким образом, чтобы они легко адаптировались для различных языков и регионов без внесения конструктивных изменений. Характеристики интернационализированного приложения: • один и тот же код может работать в любой местности при условии добавления данных о локализации; • приложение отображает текст на родном языке конечного пользователя; • текстовые элементы не являются частью кода, а хранятся отдельно и запрашиваются динамически; • поддержка новых языков не требует перекомпиляции; • данные, зависящие от местности, такие как даты и денежные единицы, отображаются в соответствии с регионом и языком конечного пользователя; • приложение может быть быстро и легко локализовано. Локализация Локализация - это процесс адаптации программного обеспечения для определенного региона или языка путем добавления специфических для данной местности компонентов и перевода текста. Данные, зависящие от местности: • текст; • числа; • денежные единицы; • дата и время; 41 • изображения; • цвета; • звуки. Пример программы import java.util.*; public class IntTest { static public void main(String args[]) { if (args.length != 2) { System.out.println ("Format: java IntTest lang country"); System.exit(-1); } String language = new String(args[0]); String country = new String(args[1]); Locale loc = new Locale(language, country); ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", loc); System.out.println(messages.getString("greeting")); System.out.println(messages.getString("inquiry")); System.out.println(messages.getString("farewell")); } } Имя файла Содержимое MessageBundle.properties greeting = Hello! inquiry = How are you? farewell = Goodbye! MessageBundle_ru_RU.properties greeting = Привет! inquiry = Как дела? farewell = До свидания! Класс Locale Представляет определенный географический, политический или культурный регион (местность). Конструкторы: public Locale (String language, // ISO 639 String country) // ISO 3166 public Locale (String language, String country, String variant) 42 Пример: Locale current = new Locale("en", "US"); Locale loc = new Locale("ru", "RU", "koi8r"); Методы: public String getLanguage() public String getCountry() public String getVariant() public static Locale getDefault() public static synchronized void setDefault(Locale loc) Метод Locale.getDefault() возвращает значение Locale , используемое по умолчанию. Установить его можно следующим образом: • с помощью системных свойств user.language и user.region • с помощью метода Locale.setDefault() Получить список возможных комбинаций языка и страны можно с помощью статического метода getAvailableLocales() различных классов, которые используют форматирование с учетом местных особенностей. Например: Locale list[] = DateFormat.getAvailableLocales() Класс ResourceBundle Абстрактный класс, предназначенный для хранения наборов зависящих от местности ресурсов. Обычно используется один из его подклассов: • ListResourceBundle • PropertyResourceBundle Представляет собой набор связанных классов с единым базовым именем, и различающихся суффиксами, задающими язык, страну и вариант. MessageBundle MessageBundle_ru MessageBundle_en_US MessageBundle_fr_CA_UNIX Методы: public static final ResourceBundle getBundle(String name) throws MissingResourceException public static final ResourceBundle getBundle(String name, Locale locale) throws MissingResourceException Эти методы возвращают объект одного из подклассов ResourceBundle с базовым именем name и местностью, заданной объектом locale или взятой 43 по умолчанию. При отсутствии данного ресурса осуществляется поиск наиболее подходящего из имеющихся (путем последовательного исключения суффиксов), при неудаче инициируется исключение MissingResourceException Класс ListResourceBundle Абстрактный класс, управляющий ресурсами с помощью списка. Используется путем создания набора классов, расширяющих ListResourceBundle, для каждой поддерживаемой местности и определения метода getContents() Пример: public class MessageBundle_ru extends ListResourceBundle { public Object[][] getContents() { return contents; } public Object[][] contents = { { "greeting", "Привет!" }, { "inquiry", "Как дела?" }, { "farewell", "До свидания!" } }; } Массив contents содержит список пар ключ-значение, причем ключ должен быть объектом типа String , а значение - Object Объект класса ListResourceBundle можно получить вызовом статического метода ResourceBundle.getBundle() ResourceBundle messages = ResourceBundle.getBundle("MessageBundle", new Locale("ru", "RU")); Поиск классов осуществляется в следующей последовательности: 1. MessageBundle_ru_RU.class 2. MessageBundle_ru.class 3. MessageBundle.class Для получения желаемого значения объекта используется метод getObject : String s = (String) messages.getObject("greeting"); 44 Класс PropertyResourceBundle Абстрактный класс, управляющий ресурсами с помощью набора свойств. Используется в случаях, когда локализуемые объекты имеют тип String Ресурсы хранятся отдельно от кода, поэтому для добавления новых ресурсов не требуется перекомпиляция. Пример файлa Message_it.properties : greeting = Ciao! inquiry = Come va? farewell = Arrivederci! Объект класса PropertyResourceBundle можно получить вызовом статического метода ResourceBundle.getBundle() : ResourceBundle messages = ResourceBundle.getBundle("MessageBundle", new Locale("it", "IT")); Если метод getBundle() не может найти соответствующий класс, производится поиск файлов с расширением .properties в той же последовательности, как и для ListResourceBundle : 1. MessageBundle_it_IT.properties 2. MessageBundle_it.properties 3. MessageBundle.properties Для получения значения свойства используется метод getString String s = messages.getString("greeting") Иерархия классов java.text Иерархия классов пакета java.text приведена на рис. 7. Класс NumberFormat Абстрактный класс, позволяющий форматировать числа, денежные единицы, проценты в соответствии с форматом, принятым в определенной местности * Форматирование осуществляется в 2 этапа: * Список допустимых местностей, для которых определены форматы, можно получить с помощью статического метода public Locale[] NumberFormat.getAvailableLocales() 45 Рисунок 7. Пакет java.text 1. Получение требуемого экземпляра класса с помощью одного из методов • getNumberInstance • getCurrencyInstance • getPercentInstance 2. Вызов метода format() для получения отформатированной строки. 46 Числа: NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMANY); String result = formatter.format(123456.789); Денежные единицы: NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.FRANCE); String result = formatter.format(4999.99); Проценты: NumberFormat formatter = NumberFormat.getPercentInstance(Locale.US); String result = formatter.format(.75); Класс DecimalFormat Позволяет создавать собственные форматы для чисел, денежных единиц и процентов. Порядок использования: 1. Вызывается конструктор с шаблоном в качестве аргумента String pattern = "###,##0.##"; DecimalFormat formatter = new DecimalFormat(pattern); 2. Вызывается метод format() для получения отформатированной строки String s = formatter.format(123123.456); Значения символов шаблона: Символ Значение 0 цифра # цифра, или пробел в случае нуля десятичный разделитель , групповой разделитель ; разделитель форматов - префикс отрицательного числа % процент (значение умножается на 100) ? промилле (значение умножается на 1000) ¤ заменяется обозначением денежной единицы (международным если удвоен) и в формате вместо десятичного будет использован денежный разделитель X любой другой символ в префиксе или суффиксе ' используется для экранирования специальных символов в префиксе или суффиксе 47 Класс DecimalFormatSymbols Используется для изменения значения используемых по умолчанию разделителей в классе DecimalFormat Конструкторы: public DecimalFormatSymbols() public DecimalFormatSymbols(Locale locale) Методы: public void setZeroDigit(char c) public void setGroupingSeparator(char c) public void setDecimalSeparator(char c) public void setPerMill(char c) public void setPercent(char c) public void setDigit(char c) public void setNaN(char c) public void setInfinity(char c) public void setMinusSign(char c) public void setPatternSeparator(char c) Имеются соответствующие методы get() для получения установленных значений. Для передачи значений разделителей объект DecimalFormatSymbols передается конструктору класса DecimalFormat в качестве аргумента: DecimalFormatSymbols symbols = new DecimalFormatSymbols(); symbols.setGroupingSeparator(" "); DecimalFormat formatter = new DecimalFormat("#,##0.00", symbols); String s = formatter.format(4.50); Класс DateFormat Абстрактный класс, позволяющий форматировать дату и время в соответствии с форматом, принятым в определенной местности * Форматирование осуществляется в 2 этапа: 1. Получение требуемого экземпляра класса с помощью одного из методов • getDateInstance • getTimeInstance • getDateTimeInstance * Список допустимых местностей, для которых определены форматы, можно получить с помощью статического метода public Locale[] DateFormat.getAvailableLocales() 48 2. Вызов метода format() для получения отформатированной строки. Дата: DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, Locale.UK); String result = formatter.format(new Date()); Время: DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG, Locale.FRANCE); String result = formatter.format(new Date()); Дата и время: DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US); String result = formatter.format(new Date()); Класс SimpleDateFormat Позволяет создавать форматы для даты и времени. Порядок использования: 1. Вызывается конструктор с шаблоном в качестве аргумента: SimpleDateFormat formatter = new SimpleDateFormat("K:mm EEE MMM d ''yy"); 2. Вызывается метод format() для получения отформатированной строки: String s = formatter.format(new Date()); Шаблоны SimpleDateFormat Символ Значение Тип Пример G обозначение эры текст AD y год число 1996 M месяц года текст/число July или 07 d число месяца число 23 h часы (1-12) число 5 H часы (0-23) число 22 m минуты число 45 s секунды число 31 S миллисекунды число 978 E день недели текст Tuesday D номер дня в году число 189 F день недели в месяце число 2 (2 nd Wed in July) 49 w неделя в году число 27 W неделя в месяце число 2 a знак AM/PM текст PM k часы (1-24) число 24 K часы (0-11) число 0 z временная зона текст GMT ' символ экранирования Для текста 4 и более символов задают полную форму, 3 и меньше - сокращенную. Для чисел количество символов указывает минимальный длину числа (кроме года - 2 символа обозначают год, записанный 2-мя цифрами). Смешанный формат с 3 и более символами - текст, менее 3-х — число. Класс DateFormatSymbols Используется для изменения названий месяцев, дней недели и других значений в классе SimpleDateFormat Конструкторы: public DateFormatSymbols() public DateFormatSymbols(Locale locale) Методы: public void setEras(String newValue[]) public void setMonths(String newValue[]) public void setShortMonths(String newValue[]) public void setWeekDays(String newValue[]) public void setShortWeekDays(String newValue[]) public void setAmPmStrings(String newValue[]) public void setZoneStrings(String newValue[]) public void setPatternChars(String newValue[]) Имеются соответствующие методы get() для получения установленных значений. Для передачи значений разделителей объект DateFormatSymbols передается конструктору класса SimpleDateFormat в качестве аргумента: DateFormatSymbols symbols = new DateFormatSymbols(); String weekdays[] = {"Пн","Вт","Ср","Чт","Пт","Сб","Вс"}; symbols.setShortWeekDays(weekdays); DecimalFormat formatter = new SimpleDateFormat("E", symbols); String s = formatter.format(new Date()); 50 Класс MessageFormat Используется для выдачи сообщений на различных языках с включением изменяющихся объектов. Использование класса: 1. Выделение переменных объектов в сообщении: At 1:15 PM on April 13, 1998, we detected 7 spaceships on the planet Mars. 2. Помещение шаблона сообщения в ResourceBundle: ResourceBundle messages = ResourceBundle.getBundle("MessageBundle", currentLocale); cодержимое файла MessageBundle.properties : template = At {2,time,short} on {2,date,long}, we detected {1,number,integer} spaceships on the planet {0}. planet = Mars 3. Установка аргументов сообщения: Object[] args = { messages.getString("planet"), new Integer(7), new Date() } 4. Создание объекта MessageFormat : MessageFormat formatter = new MessageFormat(messages.getString("template")); formatter.setLocale(currentLocale); 5. Форматирование сообщения: String s = formatter.format(args); Синтаксис аргументов MessageFormat { индекс аргумента, [ тип, [ стиль ] ] } Индекс задает порядковый индекс аргумента в массиве объектов (0-9). Типы и стили аргументов: Возможные типы Возможные стили number currency, percent, integer, шаблон числа date short, long, full, medium, шаблон даты time short, long, full, medium, шаблон времени choice шаблон выбора 51 Если тип и стиль отсутствуют, то аргумент должен являться строкой. При отсутствии стиля, он принимается по умолчанию. Класс ChoiceFormat Используется для задания возможности выбора различных элементов в зависимости от значения параметров. Использование класса: 1. Выделение переменных объектов в сообщении: There are no files on disk C. There is one file on disk C. There are 3 files on disk C. 2. Помещение шаблона сообщения в ResourceBundle: cодержимое файла MessageBundle.properties : template = There {0} on disk {1}. no = are no files one = is one file many = are {2} files 3. Создание объекта ChoiceFormat : double limits[] = {0,1,2} String choices[] = { messages.getString("no"), messages.getString("one"), messages.getString("many") } ChoiceFormat choice = new ChoiceFormat(limits, choices); 4. Создание объекта MessageFormat : MessageFormat formatter = new MessageFormat(messages.getString("template")); formatter.setLocale(currentLocale); Format[] formats = { choiceForm, null, NumberFormat.getInstance() } formatter.setFormats(formats); 5. Установка аргументов сообщения: Object[] args = { 1, "C", 1 }; 6. Форматирование сообщения String s = formatter.format(args); Класс Collator Используется для выполнения сравнений строк в различных языках. 52 Получение объекта: Collator c = Collator.getInstance(Locale.US); Методы: public int compare(String s1, String s2) public void setStrength(int value) // value = PRIMARY, // SECONDARY // TERTIARY // IDENTICAL public void setDecomposition(int value) // value = NO_DECOMPOSITION // CANONICAL_DECOMPOSITION // FULL_DECOMPOSITION Пример: c.setStrength(PRIMARY); if (c.compare("ABC", "abc") < 0) { // "ABC" < "abc" } else { // "ABC" >= "abc" } Класс RuleBasedCollator Используется для задания собственных правил сортировки символов. Набор правил передается конструктору в виде строки символов: String rule = "a < b < c < d"; RuleBasedCollator c = new RuleBasedCollator(rule); Формат правил: < следующий символ больше предыдущего ; следующий символ больше предыдущего без учета акцентов , следующий символ больше предыдущего без учета размера букв = следующий символ равен предыдущему @ сортировка акцентов в обратном порядке & дополнительное правило для уже встречавшихся символов Пример: RuleBasedCollator us = (RuleBasedCollator) Collator.getInstance(Locale.US); String rule = us.getRules(); String extraRule = "& c,C < ch,CH"; RuleBasedCollator sp = new RuleBasedCollator(rule + extraRule); |