Клинч (deadlock)
Клинч — редкая, но очень трудноуловимая ошибка, при которой между двумя легковесными процессами существует кольцевая зависимость от пары синхронизированных объектов. Например, если один подпроцесс получает управление объектом X, а другой — объектом Y, после чего Х пытается вызвать любой синхронизированный метод Y, этот вызов, естественно блокируется. Если при этом и Y попытается вызвать синхронизированный метод X, то программа с такой структурой подпроцессов окажется заблокированной навсегда. В самом деле, ведь для того, чтобы один из подпроцессов захватил нужный ему объект, ему нужно снять свою блокировку, чтобы второй подпроцесс мог завершить работу.
Сводка функций программного интерфейса легковесных процессов
Ниже приведена сводка всех методов класса Thread, обсуждавшихся в этой главе.
Методы класса
Методы класса — это статические методы, которые можно вызывать непосредственно с именем класса Thread.
currentThread
Статический метод currentThread возвращает объект Thread, выполняющийся в данный момент.
yield
Вызов метода yield приводит к тому, что исполняющая система переключает контекст с текущего на следующий доступный подпроцесс. Это один из способов гарантировать, что низкоприоритетные подпроцессы когда-нибудь получат управление.
sleep(int n)
При вызове метода sleep исполняющая система блокирует текущий подпроцесс на n миллисекунд. После того, как этот интервал времени закончится, подпроцесс снова будет способен выполняться. В большинстве исполняющих систем Java системные часы не позволяют точно выдерживать паузы короче, чем 10 миллисекунд.
Методы объекта
start
Метод start говорит исполняющей системе Java, что необходимо создать системный контекст подпроцесса и запустить этот подпроцесс. После вызова этого метода в новом контексте будет вызван метод run вновь созданного подпроцесса. Вам нужно помнить о том, что метод start с данным объектом можно вызвать только один раз.
run
Метод run — это тело выполняющегося подпроцесса. Это — единственный метод интерфейса Runnable. Он вызывается из метода start после того, как исполняющая среда выполнит необходимые операции по инициализации нового подпроцесса. Если происходит возврат из метода run, текущий подпроцесс останавливается.
stop
Вызов метода stop приводит к немедленной остановке подпроцесса. Это — способ мгновенно прекратить выполнение текущего подпроцесса, особенно если метод выполняется в текущем подпроцессе. В таком случае строка, следующая за вызовом метода stop, никогда не выполняется, поскольку контекст подпроцесса “умирает” до того, как метод stop возвратит управление. Более аккуратный способ остановить выполнение подпроцесса — установить значение какой-либо переменной-флага, предусмотрев в методе run код, который, проверив состояние флага, завершил бы выполнение подпроцесса.
suspend
Метод suspend отличается от метода stop тем, что метод приостанавливает выполнение подпроцесса, не разрушая при этом его системный контекст. Если выполнение подпроцесса приостановлено вызовом suspend, вы можете снова активизировать этот подпроцесс, вызвав метод resume.
resume
Метод resume используется для активизации подпроцесса, приостановленного вызовом suspend. При этом не гарантируется, что после вызова resume подпроцесс немедленно начнет выполняться, поскольку в этот момент может выполняться другой более высокоприоритетный процесс. Вызов resume лишь делает подпроцесс способным выполняться, а то, когда ему будет передано управление, решит планировщик.
setPriority(int p)
Метод setPriority устанавливает приоритет подпроцесса, задаваемый целым значением передаваемого методу параметра. В классе Thread есть несколько предопределенных приоритетов-констант: MIN_PRIORITY, NORM_PRIORITY и MAX_PRIORITY, соответствующих соответственно значениям 1, 5 и 10. Большинство пользовательских приложений должно выполняться на уровне NORM_PRIORITY плюс-минус 1. Приоритет фоновых заданий, например, сетевого ввода-вывода или перерисовки экрана, следует устанавливать в MIN_PRIORITY. Запуск подпроцессов на уровне MAX_PRIORITY требует осторожности. Если в подпроцессах с таким уровнем приоритета отсутствуют вызовы sleep или yield, может оказаться, что вся исполняющая система Java перестанет реагировать на внешние раздражители.
SetPriority
Этот метод возвращает текущий приоритет подпроцесса — целое значение в диапазоне от 1 до 10.
setName(String name)
Метод setName присваивает подпроцессу указанное в параметре имя. Это помогает при отладке программ с параллельными подпроцессами. Присвоенное с помощью setName имя будет появляться во всех трассировках стека, которые выводятся при получении интерпретатором неперехваченного исключения.
getName
Метод getName возвращает строку с именем подпроцесса, установленным с помощью вызова setName.
Есть еще множество функций и несколько классов, например, ThreadGroup и SecurityManager, которые имеют отношение к подпроцессам, но эти области в Java проработаны еще не до конца. Скажем лишь, что при необходимости можно получить информацию об этих интерфейсах из документации по JDK API.
Дәріс №10. Утилиттер
Библиотека классов языка включает в себя набор вспомогательных классов, широко используемых в других встроенных пакетах Java. Эти классы расположены в пакетах java.lang и java.util. Они используются для работы с наборов объектов, взаимодействия с системными функциями низкого уровня, для работы с математическими функциями, генерации случайных чисел и манипуляций с датами и временем.
Простые оболочки для типов
Как вы уже знаете, Java использует встроенные примитивные типы данных, например, int и char ради обеспечения высокой производительности. Эти типы данных не принадлежат к классовой иерархии Java. Они передаются методам по значению, передать их по ссылке невозможно. По этой причине для каждого примитивного типа в Java реализован специальный класс.
Number
Абстрактный класс Number представляет собой интерфейс для работы со всеми стандартными скалярными типами: — long, int, float и double.
У этого класса есть методы доступа к содержимому объекта, которые возвращают (возможно округленное) значение объекта в виде значения каждого из примитивных типов:
• doubleValue() возвращает содержимое объекта в виде значения типа double.
• floatValue() возвращает значение типа float.
• intValue() возвращает значение типа int.
• longValue() возвращает значение типа long.
Double и Float
Double и Float — подклассы класса Number. В дополнение к четырем методам доступа, объявленным в суперклассе, эти классы содержат несколько сервисных функций, которые облегчают работу со значениями double и float. У каждого из классов есть конструкторы, позволяющие инициализировать объекты значениями типов double и float, кроме того, для удобства пользователя, эти объекты можно инициализировать и объектом String, содержащим текстовое представление вещественного числа. Приведенный ниже пример иллюстрирует создание представителей класса Double с помощью обоих конструкторов.
class DoubleDemo {
public static void main(String args[]) {
Double d1 = new Double(3.14159);
Double d2 = new Double("314159E-5");
System.out.println(d1 + " = " + d2 + " -> " + d1.equals(d2));
} }
Как вы можете видеть из результата работы этой программы, метод equals возвращает значение true, а это означает, что оба использованных в примере конструктора создают идентичные объекты класса Double.
С:\> java DoubleDemo
3.14159 = 3.14159 -> true
Бесконечность и NaN
В спецификации IEEE для чисел с вещественной точкой есть два значения типа double, которые трактуются специальным образом: бесконечность и NaN (Not a Number — неопределенность). В классе Double есть тесты для проверки обоих этих условий, причем в двух формах — в виде методов (статических), которым значение double передается в качестве параметра, и в виде методов, проверяющих число, хранящееся в объекте класса Double.
• islnfinite(d) возвращает true, если абсолютное значение указанного числа типа double бесконечно велико.
• islnfinite() возвращает true, если абсолютное значение числа, хранящегося в данном объекте Double, бесконечно велико.
• isNaN(d) возвращает true, если значение указанного числа типа double неопределено.
• isNaN() возвращает true, если значение числа, хранящегося в данном объекте Double, неопределено.
Очередной наш пример создает два объекта Double, один с бесконечным, другой с неопределенным значением.
class InfNaN {
public static void main(String args[]) {
Double d1 = new Double(1/0.);
Double d2 = new Double(0/0.);
System.out.println(d1 + ": " + d1.isInfinite() + ", " + d1.isNaN());
System.out.println(d2 + ": " + d2.isInfinite() + ", " + d2.isNaN());
} }
Ниже приведен результат работы этой программы:
С:\> java InfNaN
Infinity: true, false
NaN: false, true
Integer и Long
Класс Integer — класс-оболочка для чисел типов int, short и byte, a класс Long — соответственно для типа long. Помимо наследуемых методов своего суперкласса Number, классы Integer и Long содержат методы для разбора текстового представления чисел, и наоборот, для представления чисел в виде текстовых строк. Различные варианты этих методов позволяют указывать основание (систему счисления), используемую при преобразовании. Обычно используются двоичная, восьмеричная, десятичная и шестнадцатиричная системы счисления.
parseInt(String) преобразует текстовое представление целого числа, содержащееся в переменной String, в значение типа int. Если строка не содержит представления целого числа, записанного в допустимом формате, вы получите исключение NumberFormatException.
parseInt(String, radix) выполняет ту же работу, что и предыдущий метод, но в отличие от него с помощью второго параметра вы можете указывать основание, отличное от 10.
toString(int) преобразует переданное в качестве параметра целое число в текстовое представление в десятичной системе.
toString(int, radix) преобразует переданное в качестве первого параметра целое число в текстовое представление в задаваемой вторым параметром системе счисления.
Character
Character — простой класс-оболочка типа char. У него есть несколько полезных статических методов, с помощью которых можно выполнять над символом различные проверки и преобразования.
isLowerCase(char ch) возвращает true, если символ-параметр принадлежит нижнему регистру (имеется в виду не просто диапазон a-z, но и символы нижнего регистра в кодировках, отличных от ISO-Latin-1).
isUpperCase(char ch) делает то же самое в случае символов верхнего регистра.
isDigit(char ch) и isSpace(char ch) возвращают true для цифр и пробелов, соответственно.
toLowerCase(char ch) и toupperCase(char ch) выполняют преобразования символов из верхнего в нижний регистр и обратно.
Boolean
Класс Boolean — это очень тонкая оболочка вокруг логических значений, она бывает полезна лишь в тех случаях, когда тип boolean требуется передавать по ссылке, а не по значению.
Перечисления
В Java для хранения групп однородных данных имеются массивы. Они очень полезны при использовании простых моделей доступа к данным. Перечисления же предлагают более совершенный объектно-ориентированный путь для хранения наборов данных сходных типов. Перечисления используют свой собственный механизм резервирования памяти, и их размер может увеличиваться динамически. У них есть интерфейсные методы для выполнения итераций и для просмотра. Их можно индексировать чем-нибудь более полезным, нежели простыми целыми значениями.
Интерфейс Enumeration
Enumeration — простой интерфейс, позволяющий вам обрабатывать элементы любой коллекции объектов. В нем задается два метода. Первый из них — метод hasMoreElements, возвращающий значение типа boolean. Он возвращает значение true, если в перечислении еще остались элементы, и false, если у данного элемента нет следующего. Второй метод — nextElement — возвращает обобщенную ссылку на объект класса Object, которую, прежде чем использовать, нужно преобразовать к реальному типу содержащихся в коллекции объектов.
Ниже приведен пример, в котором используется класс Enum, реализующий перечисление объектов класса Integer, и класс EnumerateDemo, создающий объект типа Enum, выводящий все значения перечисления. Обратите внимание на то, что в объекте Enum не содержится реальных данных, он просто возвращает последовательность создаваемых им объектов Integer.
import java.util.Enumeration;
class Enum implements Enumeration {
private int count = 0;
private boolean more = true;
public boolean hasMoreElements() {
return more;
}
public Object nextElement() {
count++;
if (count > 4) more = false;
return new Integer(count);
} }
class EnumerateDemo {
public static void main(String args[]) {
Enumeration enum = new Enum();
while (enum.hasMoreElements()) {
System.out.println(enum.nextElement());
}
} }
Вот результат работы этой программы:
С:\> java EnumerateDemo
1
2
3
4
5
Vector
Vector — это способный увеличивать число своих элементов массив ссылок на объекты. Внутри себя Vector реализует стратегию динамического расширения, позволяющую минимизировать неиспользуемую память и количество операций по выделению памяти. Объекты можно либо записывать в конец объекта Vector с помощью метода addElement, либо вставлять в указанную индексом позицию методом insertElementAt. Вы можете также записать в Vector массив объектов, для этого нужно воспользоваться методом copyInto. После того, как в Vector записана коллекция объектов, можно найти в ней индивидуальные элементы с помощью методов Contains, indexOf и lastIndexOf. Кроме того методы еlеmentAt, firstElement и lastElement позволяют извлекать объекты из нужного положения в объекте Vector.
Stack
Stack — подкласс класса Vector, который реализует простой механизм типа “первым вошел — первым вышел" (FIFO). В дополнение к стандартным методам своего родительского класса, Stack предлагает метод push для помещения элемента в вершину стека и pop для извлечения из него верхнего элемента. С помощью метода peek вы можете получить верхний элемент, не удаляя его из стека. Метод empty служит для проверки стека на наличие элементов — он возвращает true, если стек пуст. Метод search ищет заданный элемент в стеке, возвращая количество операция pop, которые требуются для того чтобы перевести искомый элемент в вершину стека. Если заданный элемент в стеке отсутствует, этот метод возвращает -1.
Ниже приведен пример программы, которая создает стек, заносит в него несколько объектов типа Integer, а затем извлекает их.
import java.util.Stack;
import java.util.EmptyStackException;
class StackDemo {
static void showpush(Stack st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showpop(Stack st) {
System.out.print("pop -> ");
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack st = new Stack();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(st);
showpop(st);
showpop(st);
try {
showpop(st);
}
catch (EmptyStackException e) {
System.out.println("empty stack");
} }
}
Ниже приведен результат, полученный при запуске этой программы. Обратите внимание на то, что обработчик исключений реагирует на попытку извлечь данные из пустого стека. Благодаря этому мы можем аккуратно обрабатывать ошибки такого рода.
C:\> java StackDemo
stack: []
push(42)
stack: [42]
push(66)
stack: [42, 66]
push(99)
stack: [42, 66, 99]
pop -> 99
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: []
pop -> empty stack
Dictionary
Dictionary (словарь) — абстрактный класс, представляющий собой хранилище информации типа “ключ-значение”. Ключ — это имя, по которому осуществляется доступ к значению. Имея ключ и значение, вы можете записать их в словарь методом put(key, value). Для получения значения по заданному ключу служит метод get(key). И ключи, и значения можно получить в форме перечисления (объект Enumeration) методами keys и elements. Метод size возвращает количество пар “ключ-значение”, записанных в словаре, метод isEmpty возвращает true, если словарь пуст. Для удаления ключа и связанного с ним значения предусмотрен метод remove(key).
HashTable
HashTable — это подкласс Dictionary, являющийся конкретной реализацией словаря. Представителя класса HashTable можно использовать для хранения произвольных объектов, причем для индексации в этой коллекции также годятся любые объекты. Наиболее часто HashTable используется для хранения значений объектов, ключами которых служат строки (то есть объекты типа String). В очередном нашем примере в HashTable хранится информация об этой книге.
import java.util.Dictionary;
import java.util.Hashtable;
class HTDemo {
public static void main(String args[]) {
Hashtable ht = new Hashtable();
ht.put("title", "The Java Handbook");
ht.put("author", "Patrick Naugnton");
ht.put("email", "naughton@starwave.com");
ht.put(“age", new Integer(30));
show(ht);
}
static void show(Dictionary d) {
System.out.println("Title: " + d.get("title"));
System.out.println("Author: " + d.get("author"));
System.out.println("Email: " + d.get("email"));
System.out.println("Age: " + d.get("age"));
} }
Результат работы этого примера иллюстрирует тот факт, что метод show, параметром которого является абстрактный тип Dictionary, может извлечь все значения, которые мы занесли в ht внутри метода main.
С:\> java HTDemo
Title: The Java Handbook
Author: Patrick Naughton
Email: naughton@starwave.com
Age: 30
Properties
Properties — подкласс HashTable, в который для удобства использования добавлено несколько методов, позволяющих получать значения, которые, возможно, не определены в таблице. В методе getProperty вместе с именем можно указывать значение по умолчанию:
getРгореrtу("имя","значение_по_умолчанию");
При этом, если в таблице свойство “имя” отсутствует, метод вернет “значение_по_умолчанию”. Кроме того, при создании нового объекта этого класса конструктору в качестве параметра можно передать другой объект Properties, при этом его содержимое будет использоваться в качестве значений по умолчанию для свойств нового объекта. Объект Properties в любой момент можно записать либо считать из потока — объекта Stream (потоки будут обсуждаться в главе 13). Ниже приведен пример, в котором создаются и впоследствии считываются некоторые свойства:
import java.util.Properties;
class PropDemo {
static Properties prop = new Properties();
public static void main(String args[]) {
prop.put("Title", "put title here");
prop.put("Author", "put name here");
prop.put("isbn", "isbn not set");
Properties book = new Properties(prop);
book.put("Title", "The Java Handbook");
book.put("Author", "Patrick Naughton");
System.out.println("Title: " +
book.getProperty("Title"));
System.out.println("Author: " +
book.getProperty("Author"));
System.out.println("isbn: " +
book.getProperty("isbn"));
System.out.println("ean: " +
book.getProperty("ean", "???"));
} }
Здесь мы создали объект prop класса Properties, содержащий три значения по умолчанию для полей Title, Author и isbn. После этого мы создали еще один объект Properties с именем book, в который мы поместили реальные значения для полей Title и Author. В следующих трех строках примера мы вывели результат, возвращенный методом getProperty для всех трех имеющихся ключей. В четвертом вызове getProperty стоял несуществующий ключ “еаn”. Поскольку этот ключ отсутствовал в объекте book и в объекте по умолчанию prop, метод getProperty выдал нам указанное в его вызове значение по умолчанию, то есть “???”:
С:\> java PropDemo
Title: The Java Handbook
Author: Patrick Naughton
isbn: isbn not set
ean: ???
StrinsTokenizer
Обработка текста часто подразумевает разбиение текста на последовательность лексем - слов (tokens). Класс StringTokenizer предназначен для такого разбиения, часто называемого лексическим анализом или сканированием. Для работы StringTokenizer требует входную строку и строку символов-разделителей. По умолчанию в качестве набора разделителей используются обычные символы-разделители: пробел, табуляция, перевод строки и возврат каретки. После того, как объект StringTokenizer создан, для последовательного извлечения лексем из входной строки используется его метод nextToken. Другой метод — hasMoreTokens — возвращает true в том случае, если в строке еще остались неизвлеченные лексемы. StringTokenizer также реализует интерфейс Enumeration, а это значит, что вместо методов hasMoreTokens и nextToken вы можете использовать методы hasMoreElements и nextElement, соответственно.
Ниже приведен пример, в котором для разбора строки вида “ключ=значение” создается и используется объект StringTokenizer. Пары “ключ=значение” разделяются во входной строке двоеточиями.
import java.util.StringTokenizer;
class STDemo {
static String in = "title=The Java Handbook:" + "author=Patrick Naughton:" + "isbn=0-07-882199-1:" + "ean=9 780078 821998:" + "email=naughton@starwave. corn";
public static void main(String args[]) {
StringTokenizer st = new StringTokenizer(in, "=:");
while (st.hasMoreTokens()) {
String key = st.nextToken();
String val = st.nextToken();
System.out.println(key + "\t" + val);
}
} }
Runtime
Класс Runtime инкапсулирует интерпретатор Java. Вы не можете создать нового представителя этого класса, но можете, вызвав его статический метод, получить ссылку на работающий в данный момент объект Runtime. Обычно апплеты и другие непривелигированные программы не могут вызвать ни один из методов этого класса, не возбудив при этом исключения SecurityException. Одна из простых вещей, которую вы можете проделать с объектом Runtime — его останов, для этого достаточно вызвать метод exit(int code).
Управление памятью
Хотя Java и представляет собой систему с автоматической сборкой мусора, вы для проверки эффективности своего кода можете захотеть узнать, каков размер “кучи” и как много в ней осталось свободной памяти. Для получения этой информации нужно воспользоваться методами totalMemory и freeMemory.
ВНИМАНИЕ!
При необходимости вы можете “вручную” запустить сборщик мусора, вызвав метод gc. Если вы хотите оценить, сколько памяти требуется для работы вашему коду, лучше всего сначала вызвать gc, затем free-Memory, получив тем самым оценку свободной памяти, доступной в системе. Запустив после этого свою программу и вызвав freeMemory внутри нее, вы увидите, сколько памяти использует ваша программа.
Выполнение других программ
В безопасных средах вы можете использовать Java для выполнения других полновесных процессов в своей многозадачной операционной системе. Несколько форм метода ехес позволяют задавать имя программы и ее параметры.
В очередном примере используется специфичный для Windows вызов ехес, запускающий процесс notepad — простой текстовый редактор. В качестве параметра редактору передается имя одного из исходных файлов Java. Обратите внимание — ехес автоматически преобразует в строке-пути символы "/" в разделители пути в Windows — "\".
class ExecDemo {
public static void main(String args[]) {
Runtime r = Runtime. getRuntime();
Process p = null;
String cmd[] = { "notepad", "/java/src/java/lang/Runtime.java" };
try {
p = r.exec(cmd);
} catch (Exception e) {
System.out.println("error executing " + cmd[0]);
}
} }
System
Класс System содержит любопытную коллекцию глобальных функций и переменных. В большинстве примеров этой книге для операций вывода мы использовали метод System.out.println(). В следующей главе будут детально рассмотрены потоки InputStream и OutputStream.
Метод currentTimeMillis возвращает текущее системное время в виде миллисекунд, прошедших с 1 января 1970 года.
Метод arraycopy можно использовать для быстрого копирования массива любого типа из одного места в памяти в другое. Ниже приведен пример копирования двух массивов с помощью этого метода.
class ACDemo {
static byte a[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 };
static byte b[] = { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 };
public static void main(
String args[]) {
System.out.println("a = " + new String(a, 0));
System.out.println("b = " + new String(b, 0));
System.arraycopy(a, 0, b, 0, a.length);
System.out.println("a = " + new String(a, 0));
System.out.println("b = " + new String(b, 0));
System.arraycopy(a, 0, a, 1, a.length - 1);
System.arraycopy(b, 1, b, 0, b.length - 1);
System.out.println("a = " + new String(a, 0));
System.out.println("b = " + new String(b, 0));
} }
Как вы можете заключить из результата работы этой программы, копирование можно выполнять в любом направлении, используя в качестве источника и приемника один и тот же объект.
С:\> java ACDemo
а = ABCDEFGHIJ
b = ММММММММММ
а = ABCDEFGHIJ
b = ABCDEFGHIJ
а = AABCDEFGHI
b = BCDEFGHIJJ
Свойства окружения
Исполняющая среда Java предоставляет доступ к переменным окружения через представителя класса Properties (описанного ранее в этой главе), с которым можно работать с помощью метода System.getProperty. Для получения полного списка свойств можно вызвать метод System.getProperties() или см. таблицу 4.
Таблица 4
Стандартные системные свойства
Имя
|
Значение
|
Доступ для апплета
|
java.version
|
Версия интерпретатора Java
|
да
|
java.vendor
|
Строка идентификатора, заданная разработчиком
|
да
|
java.vendor.url
|
URL разработчика
|
да
|
java.class.version
|
Версия Java API
|
да
|
java.class.path
|
Значение переменной CLASSPATH
|
нет
|
java.home
|
Каталог, в котором инсталлирована среда Java
|
нет
|
java.compiler
|
Компилятор JIT
|
нет
|
os.name
|
Название операционной системы
|
да
|
os.arch
|
Архитектура компьютера, на котором выполняется программа
|
да
|
os.version
|
Версия операционной системы Web-узла
|
да
|
file.separator
|
Зависящие от платформы разделители файлов (/ или \)
|
да
|
path.separator
|
Зависящие от платформы разделители пути (: или ;)
|
да
|
line.separator
|
Зависящие от платформы разделители строк (\n или \r\n)
|
да
|
user.name
|
Имя текущего пользователя
|
нет
|
user.home
|
Домашний каталог пользователя
|
нет
|
user.dir
|
Текущий рабочий каталог
|
нет
|
user.language
|
2-символьный код языка для местности по умолчанию
|
нет
|
user.region
|
2-символьный код страны для местности по умолчанию
|
нет
|
user.timezone
|
Временной пояс по умолчанию
|
нет
|
user.encoding
|
Кодировка сиволов для местности по умолчанию
|
нет
|
user.encoding.pkg
|
Пакет, содержащий конверторы для преобразования символов из местной кодировки в Unicode
|
нет
|
Date
Класс Date используется для операций с датой и временем. Через него вы можете получить доступ к дате, месяцу, году, дню недели, часам, минутам, секундам. У объектов этого класса — несколько конструкторов. Самый простой — Date() — инициализирует объект текущими датой и временем. Три остальных конструктора предлагают дополнительные возможности задавать начальные значения для нового объекта.
Date(year, month, date) — устанавливает указанную дату, при этом время устанавливается в 00:00:00 (полночь).
Date(year, month, date, hours, minutes) — устанавливает указанные дату и время, секунды устанавливаются в 0.
Date(year, month, date, hours, minutes, seconds) — наиболее полное задание времени, в объекте устанавливаются указанные дата и время, в том числе и секунды.
get и set
Класс Date включает в себя набор методов для получения и установки отдельных атрибутов, хранящихся в объекте. Каждая из функций семейства get — getYear, getMonth, getDate, getDay, getHours, getMi-nutes и getSeconds — возвращает целое значение. Каждой из функций семейства set — setYear, setMonth, setDate, setHours, setMinutes и setSeconds — в качестве параметра передается целое значение. Вы также можете получить представление объекта Date в виде значения типа long с помощью метода getTime. Возвращаемое этим методом значение представляет собой число миллисекунд, прошедших после 1 января 1970 года.
Сравнение
Если у вас есть два объекта типа Date, и вы хотите их сравнить, то можете преобразовать хранящиеся в них даты в значения типа long, и сравнить полученные даты, выраженные в миллисекундах. Класс Date включает в себя три метода, которые можно использовать для прямого сравнения дат: — before, after и equals. Например, вызов
new Date(96, 2, 18).before(new Date(96, 2, 12)
возвращает значение true, поскольку 12-й день месяца предшествует 18-му.
Строки и часовые пояса
Объекты Date можно конвертировать в текстовые строки различных форматов. Прежде всего, обычный метод toString преобразует объект Date в строку, которая выглядит, как “Thu Feb 15 22:42:04 1996”. Метод toLocaleString преобразует дату в более короткую строку, выглядящую примерно так: “02/15/96 22:42:04”. И, наконец, метод toGMTString возвращает дату в формате среднего времени по Гринвичу: “16 Feb 1996 06:42:04 GMT”.
Math
Класс Math содержит функции с плавающей точкой, которые используются в геометрии и тригонометрии. Кроме того, в нем есть две константы, используемые в такого рода вычислениях: — Е (приблизительно 2.72) и PI (приблизительно 3.14159).
Тригонометрические функции
Приведенные ниже три функции имеют один параметр типа double, представляющий собой угол в радианах, и возвращают значение соответствующей тригонометрической функции.
sin(double а) возвращает синус угла а, заданного в радианах.
cos(double а) возвращает косинус угла а, заданного в радианах.
tan(double а) возвращает тангенс угла а, заданного в радианах.
Следующие четыре функции возвращают угол в радианах, соответствующий значению, переданному им в качестве параметра.
asin(double r) возвращает угол, синус которого равен г.
acos(double r) возвращает угол, косинус которого равен г.
atan(double r) возвращает угол, тангенс которого равен г.
atan2(double a, double b) возвращает угол, тангенс которого равен отношению а/b.
Степенные, показательные и логарифмические функции
pow(double у, double x) возвращает у, возведенное в степень х. Так, например, pow(2.0, 3.0) равно 8.0.
exp(double х) возвращает е в степени х.
log(double х) возвращает натуральный логарифм х.
sqrt(double х) возвращает квадратный корень х.
Округление
ceil(double а) возвращает наименьшее целое число, значение которого больше или равно а.
floor(double а) возвращает наибольшее целое число, значение которого меньше или равно а.
rint(double а) возвращает в типе double значение а с отброшенной дробной частью.
round(float а) возвращает округленное до ближайшего целого значение а.
round(double а) возвращает округленное до ближайшего длинного целого значение а.
Кроме того, в классе Math имеются полиморфные версии методов для получения модуля, нахождения минимального и максимального значений, работающие с числами типов int, long, float и double:
abs(a) возвращает модуль (абсолютное значение) а.
max(a, b) возвращает наибольший из своих аргументов.
min(a, b) возвращает наименьший из своих аргументов.
Random
Класс Random — это генератор псевдослучайных чисел. Используемый в нем алгоритм был взят из раздела 3.2.1 “Искусства программирования” Дональда Кнута. Обычно в качестве начального значения используется текущее время, что снижает вероятность получения повторяющихся последовательностей случайных чисел.
Из объекта класса Random можно извлекать 5 типов случайных чисел. Метод nextInt возвращает целое число, равномерно распределенное по всему диапазону этого типа. Аналогично, метод nextLong возвращает случайное число типа long. Методы nextFloat и nextDouble возвращают случайные числа соответственно типов float и double, равномерно распределенные на интервале 0.0..1.0. И, наконец, метод nextGaussian возвращает нормально распределенное случайное число со средним значением 0.0 и дисперсией 1.0.
Дәріс №11. Енгізу/Шығару
Java-да сандарды енгізуді басқару мəліметтерді енгізуге қарағанда күрделі.Мəліметтерді енгізуге арналған Java тілінің барлық құралдары мықты болып табылады жəне берілген программалау тілі қарапайым альтернативті болмайтынымен келісуге тура келеді.
Енгізу ағындары. Ағын термині бір деректен түсетін(мысалы пернетақтадан немесе дискідегі файлдан) мəліметтер тізбегін бейнелеу үшін қолданылады.Java тілінде System.out
объектіне эквивалент болыпSystem.in объектісі табылады. System.in объекті алдын-алажариялауды талап етеді, оның классы болып InputStream абстрактілі класы табылады. System.in объекті InputStreamReader деп аталатын, нəтижесінде объект құрылатын басқа класқа конструктор параметрі ретінде берілуі . Сонымен керек қатар программаға пернетақтадан мəліметтер енгізуді буфер арқылы жүзеге асырған бəрінен ыңғайлырақ, сондықтан объект құрғаннан кейін оны BufferedReader класына берген дұрыс. Пернетақтадан енгізу үшін ағынды жариялау.
Import java.io.*;
BufferedReader stream = new BufferedReader
(new InputStreamReader(System.in));
Java.io пакетіберіледі.System.in объектісініңнегізіндеInputStreamReader объекті құрылады жəне оны stream идентификаторы меншіктелетін BufferedReader объектін құру үшін қолданады. Алдымен жоғарыда көрсетілген үш класс анықталатынjava.io пакетінің им-порты орындалады. Содан кейін BufferedReader класының барлық қасиеттеріне ие болатын, System.in объектімен байланысты жаңа ағын құрылады.Стандартты жариялау келесі түрде болады: BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); Мұнда in пернетақтамен байланысты ағын тәрізді анықталады. Оқу кезінде байқаусызда мәліметтердің жоғалуымен немесе оларда дұрыс емес форматтардың болуымен байланысты қателер жиі болуы мүмкін. Мұндай жағдайлар келеңсіздіктер деп аталады. Java әр әдісте барлық мүмкін болатын келеңсіздіктер көрсетілгенін талап етеді. Сондықтан мәліметтерді оқымас бұрын мәліметтердің оқылуы іске асырылатын әр әдісті жариялағаннан кейін лны шақыратын келеңсіздіктерді өңдемейтін кез келген әдіс үшін trows IOExeption командасын қосу керек.
Жолдарды оқу. Println əдісіне сəйкес, BufferedReader класы қолданушылардың назарына пернетақтадан енгізілетін жолға жолдық айнымалы мəтінін меншіктейтінreadLine əдісін береді.
Жолдарды оқу: String = stream.readLine(); - stream ағынынан String типті мəліметтер жолын алады жəне оны String жолына меншіктейді.
Java-да сандарды енгізу үшінDisplay жəне Stream екі класы өңделген.Display – мəліметтерді біруақытта енгізу мен шығаруды жүзеге асыруға мүмкіндік беретін кең тараған қолданушы интерфейсі. Stream – Java тілінің консолдарының, командалық терезе немесе мəтіндік файл көмегімен мəтіндік мəліметтерді енгізу-шығарудың қарапайым құралдары.
Display класы. Display класының интерфейсі екі тақтадан тұрады: сол жақ тақта мəліметтерді енгізу үшін, ал оң жақ тақта– мəліметтерді шығару үшін. Екі тақта да экранда біруақытта бейнеленеді. Олардың əрқайсысы тақтада сыймайтын,ақпараттарға енуді қамтамасыз ететін айналу жолағымен қамтылады.Терезенің төменгі бөлігінде екі батырма бар: Дайын жəне жабу. Біріншісі қолданушы мен программа арасындағы өзара əрекетті қамтамасыз етеді, ал екіншісі программа жұмысын аяқтауға жəне терезені жабуға мүмкіндік береді. Шығару тақтасы өз жұмысын үш этапта орындайды:
Мəліметтерді енгізу қажеттілігі жайлы хабарламаның бейнеленуі.
Қолданушы орындау керек əрекеттер жайлы ақпараттар шығару.
Қолданушы енгізген мəндердің оқылуы,өрнектердің орындалуы жəненəтиженің бейнеленуі.
Көрсетілген əрекеттер Жабу батырмасы басылғанға дейін программаменқайталана береді. Енгізу тақтасы. Енгізу тақтасында қолданушы қажет жағдайда өзгерте алатын мəліметтер
бейнеленеді.
Display класының əдістері: new Display(String) – создает новый объект Display с заголов- ком; void println(String) – шығару тақтасына жолды басып шығарады; void promt (String,value)- создает на панели ввода поле с подписью и начальным значением;voidready(String)- программа Дайын батырмасының басылуын күтетіндігі жайлы хабаршығарады;Intget-Int(String)- параметр ретінде көрсетілген белгіге сәйкес int типті мәнді алады double getDouble- параметр ретінде көрсетілген белгіге сəйкес double типті мəнді оқиды; String get- String(String) - параметр ретінде көрсетілген белгіге сəйкес String типті мəнді алады. Программа бірінші бес əдісті қолданып жазылуы мүмкін. Соңғы екеуі getInt əдісінің вариациялары болып табылады.
Display класын қолдану. Display класын қолданудағы бірінші қадам осы кластың объектісін құру болып табылады. Жариялау мына түрде болады: Display display new Display(“text”). Кез келген программада ең аз дегенде бір терезе генерацияланады, бірақ мұндай қажеттілік сирек туындайды. Объект құру кезінде Display класына берілетін параметр болып терезе тақырыбы табылады. Келесі этап- – шығару тақтасында бастапқы нұсқаларды бейнелеу. Мұнда println әдісі қолданылады. Мəтіндік өрісті енгізу тақтасына орналастыруға display.promt (“text”,value) әдісі мүмкіндік береді. Мəтіндік өрістерден мəліметтер оқу үшін ең алдымен Дайын батырмасы басулы болуы керек. Батырманы баспай программа қолданушы өзгертулер енгізіп болған-болмағанын анықтай алмайды. Затем осуществляется вызов одного из методов get. Например, h=display.getInt(“text”). Параметр ретінде берілетін жол енгізу тақтасындағы өрістердің қайсысы керек екенін анықтауға мүмкіндік береді. Display объектісіс ағымдағы мәнді қайтарады және оған айнымалы меншіктейді. Javagently пакетінің display және stream кластарына ену үшін программаға сәйкес importjavagently.* операторын қолдану керек.
Конструкторлар: Stream(Input Stream filename); Stream(String filename, int how); Бірінші конструктор Input Stream ағыны белгілі болғанда, сонымен қатар пернетақтамен байланыс орнатқанда қолданылады. Екінші конструктор файлдармен байланыс орнату үшін қолданылады.
Енгізу: int readInt(); double readDouble(); String readString(); char readChar().Енгізу əдістері мəліметтерді Stream объектісінен оқиды жəне оларды көрсетілген типтен тəуелді интерпретациялайды. Егер бұл мəліметтер типі дұрыс емес болса əдіс келесі элементке өтеді. Пункттер бос орындармен немесе кейбір тыныс белгілерімен бөлінуі керек.
Шығару: void println; void print; void close(). Бұл əдістер System.out классындағыдай орындалады. Сlose əдісі əрқашан кезкелген файл үшін шақырылады. Ол егер файл жазба үшін ашық болса, мəліметтер жоғалуының алдын алады.
Форматтау əдісі: String format( int number, int align); String format( double number, intalign, int frac). Форматтау əдісікласс əдістеріболыптабылады,сондықтан Stream.format тəріздішақырылады.
Егер пернетақтадан мəліметтер енгізу керек болса, осы мақсатқа арнайы өңделген бірінші конструкторды қолдану керек:Stream.in = new Stream(System.in). Содан кейін енгізу əдістерінің жиынын қолдану керек.ReadInt жəне ReadDouble əдістері сұраныс бойынша мəндерді қайтарады. ReadStrng əдісі readLine тұрғызылған əдісіне ұқсамайды, өйткені Stream класының барлық əдістері біржолда бірнеше мəндер шығаруға мүмкіндік береді.ReadChar əдісібір символ оқиды.Барлық енгізу əдістері үнсіз келісім бойынша оқылуға жататын мəліметтер элементі басқа элементтерден босорын,табулятор, үтір немесе жол соңындағы символмен бөлінеді деп есептейді. Өкінішке орай, бұл мəліметтерді барлық жағдайларда сəтті оқи алмайтынын, яғни тек қана олар ескерілген символдармен бөлінгенде ғана оқуға болатындығын білдіреді. Əдетте мəліметтерді енгізу үшін өз кезегінде пернетақтамен байланысқан, in арқылы экранмен автоматы түрде байланыс орнататын System.out əдісі қолданылады. Төменде оқу жəне шығару операцияларын қолданудың стандарты мысалы келтірілген.
System.out.print(“Enter age”); Int age = in.readInt().
Format əдісі үшін сандық мəліметтерді шығаруды басқару үшін құралдар беріледі (шығару кезінде сандар жолдарға түрленеді).Бұл əдістер ағынмен байланысты емес, сондықтан олар файлға жазылуы тиіс мəліметтермен жұмыс жасау үшін қолданылуы мүмкін.
Форматтармен бірге аlign параметрі сандарды енгізуге қажет символдардың минималды санын анықтайды. Егер 123 саныналатын болсақ жəне align параметріүшін 6 мəнін алатын болсақ, шығару кезінде 123 санының алдынан үш бос орын аламыз. Осыған орай сандарды колонкаларға теңестіруг еболады. Format əдістері келесі маңызды қасиетке ие: егер сан өзіне берілген аралыққа сыймаса, берілген аралық оң жақтан кеңейеді,ал ондық нүктенің алдындағы цифрлар кез келген жағдайда толық шығарылады.Заттық сандар үшін frac параметрі мынадай форматы анықтайды: бөлшек бөлігі əрқашан тіркелген цифрлар санынан тұрады, ал кез келген келесі цифрлар алынып тасталады.
Тұрақтылар. Stream класындаүлкен əріппенжазылғанекітұрақтыанықталған.Java-дабастапқымəндерішекті (яғниөзгермейтін) болаберетінайнымалылардыанықтауғаболады.
Тұрақтыкелесітүрдежарияланады;
Static funal typeсonst[A1] = <мəн>;
Java-датұрақтылардыңатыбас əріптерменжазылады.
Оқу кезінде байқаусызда мəліметтердің жоғалуы немесе дұрыс емес форматпен байланысты қателер жи ітуындауы мүмкін. Мұндай жағдайлар келеңсіздіктер деп аталады. Сондықтан мəліметтерді оқуға кіріспес бұрын throws IOException командасын қосуға болады, ол оны шақырады жəн кекелеңсіздіктерді өңдемейді.
Дәріс №12. Желілік құралдар
Осы уақытқа дейін біз Java тілінің өзімен ,Jаva API ге енгізілген пакеттермен,графикамен және терезелермен жұмысты,сонымен қатар Java дағы ағындардың негізгі қасиеттерімен жұмыс жасаудың негізгі мүмкіндіктеріне тоқталған едік.
Java.net пакеті өз апплеттерін құруға және Java-да басқа компьютерлермен желі бойынша өзара байланыста болу үшін ашылған программалармен жұмыс жасауға мүмкіндік береді. Java- ға қызығушылық көбінесе екі жеңіл қатынау Web- браузерлер , Netscape және Hotjava Интернет бойынша Java апплеттерді жүктеумен және орындаумен түсіндіріледі.
Апплеттер Интернетпен және жалпы желімен тығыз байланысты.Сондықтан Java API желілік кластардың үлкен пакетінен тұратыны таң қалдырмайды.Апплеттер жергілікті компьютердің файлдарынан мәліметтер жүктей алмайтындықтан,олар мәліметтерді желіде сақтау керек және қайтадан қайтара алуы керек.API-дегі желілік кластарды екі негізгі топқа бөлуге болады сокеттермен айналысатын кластар және URL- мен айналысатын кластар.
Сокеттер мәліметтерді беру әдісін жүзеге асырмайды олар осы жұмысты орындайтын ағындар деп аталатын,енгізу/шығарудың жалпы кластарының даналарын құрады.Сокеттерді телефон сымдарымен салыстыруға болады.Осы ұқсастықты жалғастыра отырып, шығатын ағындарды дауыспен, кіретін ағындарды құлақпен салыстыруға болады.Сокет мәліметтерді желі бойынша тасымалдайды, ағындар мәліметтерді сокетке салады және оларды сыртқа шығарады.Ағындар өз ісінде пайдалы, егер сіз оларды апплеттерді программалауда қолданатын болсаңыз, онда бәрінен бұрын сокетпен біріктіріп немесе апплеттер арасындағы өзара әрекетте қолданған жөн.
Порттар мен сокеттер
Сокет идеясы Интернетте қолданылатын ТСР/IP – протоколымен үздіксіз байланысқан.Негізінен сокет желінің екі хосты арасындағы мәліметтердің үздіксіз байланысы болып табылады.Ол соңғы компьютердің желілік адресімен, сонымен қатар әр хостта портпен анықталады.Желідегі компьютерлер желіден келетін мәліметтер ағынын арнайы қабылдағыш программаларға бағыттайды, ол әр программаға жеке номер- программа портын тағайындайды.Порт- бұл клиент пен сервер арасындағы коммуникация арқылы жүзеге асырылатын абстрактілі физикалық объект.Бұл жағдайда сервер портты береді, ал клиент олармен бірігеді.
Демек, шығу мәліметтерді генерацияланғанда, мәліметтер беруді иницирлейтін программаға транзакция үшін порт номері тағайындалады.Өшірілген компьютер кіру мәліметтеріне жауап бере алмайды.TCP/IP- де арнайы протоколдар үшін порттардың анықталған номерлері сақталады-мысалы, SMTP үшін 25 және HTTP үшін 80. 1024 тен аз барлық порттардың номерлері жүйелік администратор үшін әр хостта сақталады.
Бір порт үшін бірнеше сокеттер құруға болады,бірнеше қолданушыға берілген қызметке қатынауға рұқсат алуға мүмкіндік береді.
Сокет құрғаннан кейін клиент пен сервер берілген бірігу тәсілімен анықталған ақпаратпен алмаса алады.Алмасуды ұйымдастырудың қарапайым әдістері болып жай ағынды серверден клиентке орнату болып табылады. Одан кейін сервер мәліметтерді алу мен жіберу үшін read және print әдістерін қолдана алады.
Егер Java – программа клиент болып табылса, онда ол ұқсас сервер ағындарына сәйкес сокеттер мен ағындардан тұруы керек.Telnet тәрізді қызметші программа да клиент бола алады.Сервер ретінде жүйелік қызметті алуға болады, мысалы, уақыт қызметі.
Java API класты сокеттердің өзара әрекетін java.net.Socket жүзеге асырады.Программаның келесі фрагменті ең қарапайым конструкторды қолданады:
Try{
//сокеттер арасында басйланыс құру
Socet s=new Socket (www.vmedia.com,25)
/*программаның бұл бөлігісокетпен өзара әрекетте болады*/ // сокеттер арасындағы байланысты жабу
s.close();
}catch(UnknownHostException e) {
// хост белгісіз
} catch (IOException e) {
// байланыс кезінде енгізу/шығару қатесі
}
3- кесте Socket класының конструкторлары
Конструктор
|
Сипатталуы
|
Socet(String,int)
|
Хост аты және байланысқа арналған порт
|
Socet(String,int,Boolean)
|
Хост аты,порт және сокеттің бульдік көрсеткіші:ағындар (ақиқат) үшін немесе датаграммалар (жалған) үшін
|
Socet(InetAddress,int)
|
Интернеттік адрес және байланысқа арналған порт
|
Socet(InetAddress,int,Boolean)
|
Интернеттік адрес,порт және сокеттің бульдік көрсеткіші:ағындар (ақиқат) үшін немесе датаграммалар (жалған) үшін
|
Сокетті құрған кезде қандай хостпен бірігу керектігін көрсетуге болады: хост атынан тұратын String типті айнымалының берілуімен. Осы екі тәсілдің арасында қандай айырмашылық бар? Мұны толық түсіну үшін сізге біраз TCP/IP жайлы білу керек болады.
TCP/IPпротоколы бойынша байланысты жүзге асыратын желідегі әрбір хостқа,соның ішінде Интернетке,IP-адрес деп аталатын бірегей сандық идентификатор тағайындалған.
Netscape Navigator 2.0 өшірілген серверлерден жүктелетін сенімсіз апплеттерге Интернетте сокеттерді кез келген машинаға ашуға рұқсат етпейді. Апплет сокеттерді тек өзі жүктелген хосттан аша алады. Бұл қасиет апплеттерге қажет емес немесе байқалмайтын мəліметтерді, олар жіберілетін кез келген машинадан алуға мүмкіндік бермейді. Цифрлық авторизациямен тексерілген сенімді апплеттер сенімсіздерге қарағанда, шектеулері аз болады.
Олар Интернетте кез келген хостпен өзара əрекетте болу мүмкіндігін алады. Бірақ Sun компаниясы сенімді апплеттердің идентификациясының механизмін əлі өңдеген , жоқ сол үшін барлық өшірілген апплеттер сенімсіз деп есептеледі.Апплеттер қауіпсіздігін қамтамасыз етумен байланысты шектеулер берілген қолданушының жергілікті класына тиісті каталогтан жүктелген апплеттерге қолданылмайды.
Қолданушылар бұл шектеулерді айналып өтудің бір тəсілі–апплетті өздерінің жергілікті кластарының каталогтарында орнату. Басқа тəсіл – апплет бар хосттан жіберілетін серверді жазу жəне жаңа бекітілу бойынша анықталған портқа келетін мəліметтерді қайта бағыттайды.
Үшінші тəсіл – бір Web-парақта апплет өзара əрекеттесетін хосттағы апплеттер жиыны.
Егер сіздің операциялық жүйеUNIX болмаса жəне сіз уақытша клиенттің апплетін жергілікті қатты дискіден немесе Companion CD-ROM-нан жүктейтін болсаңыз, 1-мысал жұмыс жасамайды (осы дəрістің басқа мысалдары тəрізді), егер сізде кездейсоқ уақыт сервері болмаса. Бұл апплеттің жұмыс жасауын үшінкөру http://www.vmedia.com/vvc/onlcomp/java/chapter13/example1/TimeApplet.htm кіріңіз.
Қарапайым уақытша клиенттің орындалуына мысал.Клиент уақыт серверімен апплет жүктелген хостта бірігеді. Уақыт сервері бірігу орнатылғанша күтеді де,ағымдағы уақытты хабарлайды жəне байланысты жабады. Біздің клиенттің бар жасайтыны– бұл байланысты ашып мəліметтерді оқу.
Уақыт серверінен шығу мəліметтерін оқу үшін осы мəліметтерден тұратын байттар массивіне бастапқы мəндерді меншіктейміз жəнеInputStream-нен уақыт бірлігіне бір байт бойынша ақпаратты оқимыз. Ағын толған кезде InputStream оқытуəдісі 1-ді қайтарады (өшірілген хостта сокет жабылғаннан кейін). Жай кіріс мəліметтері 50 байттан аз алады деп есептейміз, бірақ кейінірек серверден мəліметтердің белгісіз санын алудың ең тиімді тəсілдерін көрсетеміз.
private String readString(InputStream in) {
byte ary[] = new byte[50];
byte buf;
int count=0; try {
buf=(byte)in.read(); while (buf!=-1) {
ary[count]=buf; count++;
buf=(byte)in.read();
}
}catch (IOException e) { error = e
return null
}
return new String(ary,0).trim();
}
Paint әдісі уақыт серверінен шығу мәліметтерін береді,егер бәрі жақсы өтсе, немесе қате жайлы ақпарат берсе немесе дұрыс болмаса:
Public void paint(Graphics g) {g.setColor(Color.write):g.fillRect(0,0,499,249); g.setColor(Color.black);g.drawRect(0,0,499,249);if (error!=null) {
g.drawString(error.toString(),25,25);
g.drawString(error.getMessage(),25,25);} else {
g.drawString(output,25,25);
}
}
}
Сокеттермен әсіресе Java да жұмыс істеген жеңіл,барлық жұмыс кіру және шығу мәліметтерін орындауға әкеледі.Уақыт серверімен өзара әрекеттесетін жеңіл, өйткені ол кіру мәліметтерін талап етпейді.Функционалды серверлермен қалай өзара әрекеттесетінін көрсету үшін бізге ағындар класын тереңірек зерттеуге тура келеді.Ағындарға өтпес бұрын біз желілік қатынау үшін датаграммаларды қолдануға мүмкіндік беретін API кластарын қысқаша тоқталамыз.
Дәріс №13. Апплеттер
Java тілі апплеттер құруға мүмкіндік береді. Java- ның негізгі жетістігі болып, желілік ортада, мысалы, Интернетте программалау мүмкіндігі болып саналады.Бұл басқа программалау ортасында браузерде жұмыс жасайтын программалар.Апплеттер жоғары деңгейдегі терезелерді қажет етпейді, оларға браузер терезесі қызмет етеді.Олар JVM жүктемейді – оларды браузер жүктейді, JVM –ді апплетті орындау үшін өзі жүктейді.
Java тілінің қөзқарасы бойынша, апплет бұл өз кезегінде panel класын кеңейтетін Applet класының кеңейтілуі.Осылайша, апплет- бұл арнайы түрдегі тақта, қосымша әдістері мен қасиеттері бар компоненттерді орналастыруға арналған контейнер.Үнсіз келісім бойынша компоненттерді орналастыру менеджері болып, Panel класындағыдай FiowLayout қызмет етеді.Applet класы браузерде жүзеге асырылған, одан басқа тек үш интерфейс қана бaр java.applet пакетінде орналасқан.Бірақ барлық браузерлер оларды толық жүзеге асыра алмайды.
JVM апплетті жүктемейтіндіктен, main() әдісі қажет емес, ол апплеттерде болмайды. Апплеттерде конструктор сирек кездеседі.Біріншіні жүктеген кезде оның контексті құрылады.Конструктордың орындалу кезінде контекст әлі қалыптаспаған болады, сондықтан конструкторда барлығы емес тек бастапқы мәндер анықталады.
Конструкторда және mamo әдісінде орындалатын бастапқы әрекеттер, апплетте Applet класының Inito әдісіне жазылады.Бұл ідңс апплет жүктелгеннен кейін бірден Java браузердің орындаушы жүйесі арқылы автоматты түрде жүктеледі. Applet класының бастапқы кодында ол келесі түрде болады:
Public void init(){}
Init ()әдісінде аргументтер болмайды, мәндер қайтармайды және әр апплетте -Applet класының ішкі класында қайта анықталуы қажет.Кері әрекеттер – жұмыстың аяқталуы, ресурстардың босатылуы – қажетті жағдайда destroy () әдісіне жазылады, бұл әдісте апплеттің шығуы автоматты түрде орындалады.Applet класында осы әдістің бос іске асуы бар.
Қосымшаның апплетке түрлену ережелері:
-қолданушыға қатысты барлық енгізу/шығару операциялары awt пакетінің көмегімен құрылған интерфейс арқылы өтуін қаматамасыз ету.Мысалы g.drawString(“Пароль енгіз”,10,10,);программаны тоқтатуға арналған барлық құралдарды өшіру( мысалы, Жабу батырмасы). Апплет өзі шақырылған браузерде парақты жабуда немесе қарау программасының терезесін жабуда өз жұмысын аяқтайды. Апплеттер System.exit() әдісін шақыруымыз керек;
-applet пакетін импорттау, негізгі терезеде Frame-нің орнына Applet класын кеңейту;
- класс клнструкторын бір ретті инициялизациялау үшін Applet класымен шақырылатын қайта анықталған init әдісімен ауыстыру керек.
-программадан main әдісін өшіру ,applet пакеті терезе құру, оның өлшемі мен көрінуін тағайындау сияқты оның функцияларын өзіне алады;
-бұл аплеттің класының файлына сілтемеден тұратын HTML-файл құру, немесе тег деп аталатын HTML-нұсқаларды дайын параққа қосу ;
Web- браузер немесе апплетті қарау программасының көмегімен HTML файлды шақыру.
Мысал1.Hello World апплеті java.awt.*;
Import java.applet.*;
Public class Hello World extends applet{public void paint (Graphics g){
g.drawstring(“Hello,XXI century World1”,10,30);
}
}
Бұл программа HelloWorld.java файлына жазылады және әдеттегідей компиляцияланады:java HelloWorld.java.
КомпиляторHelloWorldclass файлын құрады, бірақ оны орындау үшін java интерпретаторын қолдануға болмайды, өйткені енді main() әдісі жоқ.Интерпретацияның орнына браузерге апплетті жүктеуге туралы бұйрық беру керек.
Браузерге барлық бұйрықтар HTML тегтермен (tags) белгіленіп беріледі.Демек, аплетті жүктеу туралы бұйрық
HTML мәтін:
Applet
Достарыңызбен бөлісу: |