Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница46 из 90
1   ...   42   43   44   45   46   47   48   49   ...   90

null, если такой ассоциации не найдено
После записи строки, указанной вопи сани е
,
список свойств записывается в поток, связанный с выходной Поток После записи строки, указанной вопи сани е
,
список свойств записывается в поток, связанный с выходной Поток ключ getProperty(String ключ,
String
свойствоПоУмол чанию )
void l i s t (PrintStream выходной Поток вы ходнойПо ток входной Поток входной Поток входной Поток setProperty(String ключ,
String значение выходной Поток описание)
throws IOException
void store(Writer выходной Поток описание throws
IOException

5 3 8 Часть II. Библиотека Окончание табл. Ц щ ы и .
*
»
> - -
- -

- -
- Пли га и и о
-■
0
*
" * r *'
^
т$М:^ф»-
# Щ Щ Лог х ,
* ,
^
< У Щ У Я ПИ Св ы ход ной Поток описание выходной Поток описание y N a m e s (После записи строки, указанной вопи сани е
,
список свойств записывается в документ
XML, связанный с выходной Поток Список свойств и строка, указанная вопи сани е, записываются в документ XML, связанный с выходной Поток с применением указанной кодировки символов
Возвращает набор ключей
Одно удобное свойство класса
Properties
— это то, что вы можете указать значения по умолчанию, которые будут возвращены, если никакое значение не ассоциировано с определенным ключом. Например, значение по умолчанию может быть указано вместе с ключом в методе get
Property
() — как, например, get
Property
( имя" значение по умолчанию. Если значение имя не найдено, возвращается
" значение по умолчанию При создании объекта класса
Properties вы можете передать ему другой экземпляр класса
Properties в качестве списка свойств по умолчанию для нового экземпляра. В этом случае, если вы вызываете метод get
Property
(" f о о ") для данного объекта класса
Properties и " f оо" не существует, Java ищет его в объекте класса
Properties по умолчанию. Это позволяет иметь произвольное количество уровней вложения свойств по умолчанию.
В следующем примере демонстрируется применение класса
Properties. В нем создается список свойств, в котором ключами являются названия штатов, а значениями — названия столиц. Обратите внимание на то, что попытка найти столицу Флориды включает значение по умолчанию PropDemo {

public static void main(String a r g s []) {
Properties capitals = new Properties(); Иллинойс "Спрингфилд Миссури" ,
"Джефферсон-Сити"); Вашингтон "Олимпия Калифорния "Сакраменто Индиана "Индианаполис Получить набор ключей states = capitals.k e ySet();

// Показать все штаты и столицы
for(Object name :
Столица штата " + name + " - " +
capitals.getProperty((String)name) +
" . ") ;
System.out.println();
// Поиск штата, не содержащегося в списке — с указанием
// умолчания str = Флорида "не найдена");
System.out.println("Столица Флориды " + str + "Вывод этой программы показан ниже.
Столица штата Миссури — Джефферсон-Сити.
Столица штата Иллинойс - Спрингфилд
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 3 Столица штата Индиана - Индианаполис.
Столица штата Калифорния - Сакраменто.
Столица штата Вашингтон - Олимпия.
Столица Флориды не найдена.
Поскольку Флорида не содержится в списке, используется значение по умол­
чанию.
Хотя это исключительно правильно — использовать значения по умолчанию при вызове метода g e t P r o p e r t y ( )
, как показано в предыдущем примере, существует лучший способ управления значениями по умолчанию для большинства приложений, имеющих дело со списками свойств. Для большей гибкости задавайте список свойств по умолчанию при создании объекта класса
P r o p e r t i e s . Если нужный ключ в главном списке на найден, поиск производится в списке по умолчанию. Например, ниже представлена слегка измененная версия предыдущей программы с применением списка штатов по умолчанию. Теперь, когда ищется столица Флориды, она будет найдена в списке по умолчанию Использование списка свойств по умолчанию
import java.util.*;
class PropDemoDef {
public static void main(String a r g s []) {
Properties defList = new Properties(); Флорида "Тэлесси");
Висконсин "Мэдисон");

Properties capitals = new Properties(defList); Иллинойс "Спрингфилд
capitals.p u t (Миссури "Джефферсон-Сити"); Вашингтон "Олимпия Калифорния "Сакраменто Индиана "Индианаполис Получить набор ключей states = capitals.k e ySet();
// Показать все штаты и столицы
for(Object name :
Столица штата " + name + " - " +
capitals.getProperty((String)name) +
System.out.println();
// Теперь Флорида будет найдена в списке по умолчанию str = capitals.getProperty("Флорида");
System.out.println("Столица Флориды - " + str + "Использование методов
s t o r e (
) и
l o a d ( Один из наиболее удобных аспектов класса
P r o p e r t i e s в том, что информация, содержащаяся в объекте класса
P r o p e r t i e s , может быть легко сохранена и загружена с диска методами s t o r e ( ) и l o a d ( )
. В любой момент вы можете записать объект класса
P r o p e r t i e s в поток либо прочесть его обратно. Это делает списки свойств особенно удобными для реализации простых баз данных. Например, следующая программа использует список свойств для создания простого телефонного справочника, хранящего имена и номера телефонов. Чтобы най­

5 4 0 Часть II. Библиотека Java
ти номер лица, вы вводите имя. Программа использует методы s t o r e () и l o a d () для сохранения и чтения списка. Когда эта программа выполняется, вначале она пытается загрузить список из файла по имени p h o n e b o o k .d a t. Если этот файл существует, он загружается. Затем вы можете добавлять новые значения в список. Если вы это делаете, список сохраняется при завершении программы. Обратите внимание на то, насколько компактный код требуется для реализации маленькой, но функциональной компьютеризованной телефонной книги Простая база данных телефонных номеров, использующая списки свойств. */

import java.io.*;
import java.util.*;
class Phonebook {
public static void main(String a r g s []) throws IOException {
Properties ht = new Properties();
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String name, number;
Filelnputstream fin = null;
boolean changed = false;
// Попытка открыть файл phonebook.dat.
try {
fin = new Filelnputstream("phonebook.da t ");
} catch(FileNotFoundException e) {
// Игнорировать отсутствующий файл
}
/*Если телефонная книга уже существует, загрузить существующие телефонные номера
try {
if(fin I= null)
{
h t .load(fin);
fin.close();
}
} c a t c h (IOException e) {
System, out .println (Ошибка чтения файла Разрешить пользователю вносить новые имена и номера телефонов
do Введите имя" +
" (выход' для останова ");
name = b r .readLine(); выход) Введите номер ");

number = b r .readLine();
h t .p u t (n a m e ,
number);
changed = true;
} w h i l e (!n a m e выход Если телефонная книга изменилась, сохранить ее
if(changed) {
FileOutputStream fout = new
FileOutputStream("phonebook.dat");
h t .store(fout,
"Телефонная книга
fout.c l o s e ();
}
// Искать номер по имени
do Введите имя для поиска" +
" (выход' для останова ");
Глава 17. Пакет java.util: инфраструктура Collections Fram ew ork
5 4 1
name = b r выход) continue;
number = (String) h t .get(name);
System.out.println(number);
} w h i l e (Iname.equals("выход"));
}
}
Заключительные соображения по поводу коллекций
Инфраструктура коллекций предлагает вам, как программисту, мощный набор тщательно спроектированных решений для некоторых наиболее часто встречающихся программистских задач. Теперь, когда инфраструктура коллекций стала обобщенной, она может применяться с поддержкой полной безопасности типов, что способствует ее дальнейшему развитию. Рассмотрите возможность применения коллекций в следующий раз, когда вам понадобится сохранять и извлекать информацию. Помните, что коллекции не предназначены только для крупных задач вроде корпоративных баз данных, списков почтовых рассылок либо систем инвентаризации. Они также эффективны для решения небольших задач. Например, коллекция класса
ТгееМар может отлично подойти для хранения структуры каталогов или наборов файлов. Класс
TreeSet может оказаться довольно удобным для хранения информации по управлению проектом. В общем случае, типы проблем, при решении которых средствами коллекций можно получить существенный выигрыш, ограничиваются только вашим воображением


Пакет j a v a . u t i l : прочие служебные
классы
В этой главе продолжается обсуждение пакета java.util, рассматриваются классы и интерфейсы, которые не являются частью инфраструктуры коллекций. Сюда относятся классы, разбивающие строки на лексемы, работающие с датами, создающие случайные числа, связывающие ресурсы и наблюдающие за событиями. Также описываются новые классы
Formatter и
Scanner, которые облегчают чтение и запись форматированных данных. И наконец, вкратце упоминаются вложенные пакеты j ava Класс Обработка текста зачастую предполагает разбор форматированной входной строки. Разбор (parsing) — это разделение текста на набор дискретных составных частей, или лексем (token), представляющих определенные последовательности, которые могут иметь некоторое семантическое значение. Класс
StringTokenizer, представляющий первый этап в процессе разбора, часто называют лексическим анализатором или сканером. Этот класс реализует интерфейс
Enumeration. Таким образом, получая входную строку, вы можете перебрать содержащиеся в ней индивидуальные лексемы с помощью класса Чтобы использовать класс
StringTokenizer, вы указываете входную строку и строку, содержащую разделители. Разделители (delimiters) — это символы, разделяющие лексемы. Каждый символ в строке разделителей рассматривается как допустимый разделитель — например, строка " , ; : " устанавливает в качестве разделителей запятую, точку с запятой и двоеточие. Набор разделителей по умолчанию состоит из пробельных символов пробела, знака табуляции, перевода строки и возврата каретки.
Конструкторы класса
StringTokenizer показаны ниже t r i n g T o kenizer(String строка t r i n g T o k e n i z e r (String строка String разделители t r i n g T o k e nizer(String строка String разделители boolean
разделителиКакЛексемы)
Во всех трех версиях строка

это строка, которая будет разделена на части. Впервой версии используются разделители по умолчанию. Во второй и третьей версиях разделители
это строка, задающая разделители. В третьей версии, если параметр
разделителиКакЛексемы содержит значение true, сами разделители возвращаются в качестве отдельных лексем при разборе строки. В противном случае разделители не возвращаются. Разделители также не возвращаются в первых двух формах

5 4 Часть II. Библиотека Однажды создав объект класса
StringTokenizer, можно использовать его метод next
Token
() для извлечения последовательных лексем. Метод hasMoreTo- kens
() возвращает значение t rue до тех пор, пока существуют лексемы для извлечения. Поскольку класс
StringTokenizer реализует интерфейс
Enumeration, методы hasMoreElements
() и next
Element
() также реализованы, и они работают точно также, как, соответственно, методы hasMoreTokens
() и nextTo- ken ()
. Методы класса
StringTokenizer перечислены в табл. Таблица 18.1. Методы, определенные в классе

S t r i n g T o k e n i z e Метод
j К яь.
>' f; * Ф r,
s

'‘ Kpc x - :'4' <
‘ 'v
int c o u n t T o k e n Используя текущий набор разделителей, метод определяет количество лексем, которые осталось разобрать и вернуть в результате
boolean
Возвращает значение
true, если одна или более лексем a s M o r e E l e m e n t остались в строке, в противном случае возвращает значение h a s M o r e Возвращает значение
true, если одна или более лексем остались в строке, в противном случае возвращает значение n e x t E l e m e n Возвращает следующую лексему как объект класса
Obj ect
String n e x t T o k e Возвращает следующую лексему как объект класса Возвращает следующую лексему как объект класса e x t T o k e n
(
String
Obj ect и устанавливает строку разделителей, как указано раздел ител ив разделители Ниже приведен пример, создающий объект класса
StringTokenizer для разбора пар ключ значение. Последовательность наборов ключ значение разделена точкой с запятой Демонстрация применения StringTokenizer.

import j a v a .u t i l .StringTokenizer;
class STDemo {
static String in = "title=Java: The Complete Reference;" +
"author=Schildt;" +
"publisher=McGraw-Hill;" +
"copyright=2011";
public static void main(String a r g s []) {
StringTokenizer st = new StringTokenizer(in, "=;");
while(st.hasMoreTokens()) {
String key = s t .nextToken();
String val = s t .nextToken();
System.out.println(key + "\t" + Вывод этой программы выглядит так Java: The Complete Reference
author Schildt
publisher McGraw-Hill
copyright 2 011
Глава 18. Пакет java.util: прочие служебные классы 4 Класс Этот класс создает специальный тип массива, содержащий битовые значения. При необходимости массив
B i t S e t может увеличиваться в размере. Это делает его похожим на битовый вектор. Конструкторы класса
B i t S e t показаны ниже e t ()

BitSet(int
размер)
Первая версия создает объект по умолчанию. Вторая версия позволяет указать начальный размер (те. количество битов, которые можно сохранить. Все биты инициируются нулями.
Класс
B i t S e t определяет методы, представленные в табл. Таблица 18.2. Методы, определенные в классе

B i t S e t
Метод
Описание
void and(BitSet набор Бит набор Бит индекс нач Индекс ко нИ нде кс )
Object c l o n e ()
boolean equals(Object набор Бит индекс нач Индекс ко нИ нде кси н дек сна ч Индекс ко нИ нде кс )
int h a s h C o d e ()
boolean intersects(BitSet набор Бит (Выполняет операцию логического И (AND) между вызывающим объектом класса
BitSet и указанным в параметре набор Бит.
Результат помещается в вызывающий объект
Для каждого бита в наборе, равного 1, сбрасывается соответствующий битв вызывающем объекте класса
BitSet
Возвращает количество установленных битов в вызывающем объекте
Устанавливает все биты в нуль
Устанавливает в нуль битв позиции индекс Устанавливает в нуль биты от на чИндекс док он Индекс b-1bДублирует вызывающий объект
Возвращает значение
true, если вызывающий набор битов эквивалентен переданному в параметре набор Бит.
В противном случае возвращает значение
false
Обращает бит, находящийся в позиции индекс Обращает биты в диапазоне от нач Индекс док он Индекс b-1bВозвращает текущее значение бита в позиции индекс Возвращает объект класса
BitSet, состоящий избит от нач Индекс до кон Индекс- Возвращает хеш-код вызывающего объекта
Возвращает значение
true, если хотя бы одна пара соответствующих битов в вызывающем объекте и набор Бит равна Возвращает значение
true, если все биты вызывающего объекта установлены в О
Возвращает количество битов, необходимых для того, чтобы уместить содержимое вызывающего объекта класса
BitSet. Это значение определяется по положению последнего бита, равного 1____________________
18 Зак. 3 03 0

5 4 Часть II. Библиотека Окончание табл. 18.2
Метод
Описание
int n e x t C l e a r B i t (int нач Индекс нач Индекс набор Бит нач Индекс нач Индекс индекс индекс нач Индекс кон Индекс нач Индекс кон Индекс L o n g A r r a y ()

String t o S t r i n g ()
static BitSet
v a l u e O f ( b y t e []
v)
static BitSet
valueOf(ByteBuffer
v)
static BitSet
v a l u e O f (l o n g []
v)
static BitSet
valueOf(LongBuffer
v)
void xor(BitSet набор Б и т)
Возвращает позицию следующего сброшенного бита те. следующего бита, равного 0), начиная с индекса, указанного в нач Индекс Возвращает позицию следующего установленного бита (те. следующего бита, равного 1) начиная с индекса, указанного в на чИндекс.
Если ни один бит не установлен, возвращается значение -1 Выполняет операцию логического ИЛИ (OR) между вызывающим объектом класса
BitSet и указанным в параметре набор Бит Результат помещается в вызывающий объект
Возвращает индекс следующего сброшенного бита те. бита, равного 0) до индекса, указанного в начИндекс или равного ему. Если сброшенного бита не найдено, возвращает значение -1. (Добавлено b
JDK Возвращает индекс следующего установленного бита те. бита, равного 1) до индекса, указанного начИ ндекс или равного ему. Если установленного бита не найдено, возвращает значение -1. (Добавлено b
JDK Устанавливает битв позиции индекс равным Устанавливает битв позиции индекс равным значению, переданному в
v. Значение
true устанавливает бита значение
false —
сбрасывает
Устанавливает биты в позициях от нач Индекс док он Индекс равными Устанавливает биты в позициях от нач Индекс док он Индекс равными значению, переданному в v. Значение
1   ...   42   43   44   45   46   47   48   49   ...   90


написать администратору сайта