45049 (664171), страница 15
Текст из файла (страница 15)
char : 2 byte (чтобы туда влазила кодировка unicode - см www.unicode.org - 65 000 символов на всех языках и еще место осталось). В Win окне или в DOS-окне не сработает, но в бродилках все ОК
Логические-булевские
boolean : thrue/false (нельзя как в других языках понимать это как 0 или 1)
Что такое "простые типы" ? Это значит отвели память и никак ее не структурировали. А еще существуют сложные типы данных - объекты. Об них позднее. Теперь о них упоминаю, чтоб вас не пугало отсутствие строкового типа string. Объекты - это современно и здорово. Это нужно освоить. Это несложно и удобно... Но пока закончим разговор про простые типы.
int a; // мы сделали переменную имя а для хранения целого числа.
// в конце оператора ставят ; и пробелов, табуляций.. может
// быть много (не то что в Бейсике)
Память не только выделилась, но и заполнилась. В других языках надо инициализировать переменную - назначить ей некоторое значение, "ноль" например, иначе там будет вредный мусор. А в java переменная сама собой заполняется нулями. Вещественная переменная заполнилась бы 0,0 ; Символьная заполнится нулевым символом кодировки unicode (т.е. 0000 ), boolean - false ; (хотя лучше все же инициализировать явно, по старинке)
Вводить переменные можно в любом месте до их использования. А не только в начале.
Имена как и в других языках - состоят из букв, цифр (но с цифры имя нельзя чтоб начиналось), символа подчеркивания. (это правило полезно использовать и в именах файлов)
a = 5 ; // в объявленную ранее переменную занесли 5
Можно эти операции объединить вот так:
int a = 5 ;
Примеры для переменных других простых типов:
float c = 7.2 ;
boolean d = true ;
char e = 'M' ; // только в одинарные кавычки
Спецсимволы - как и в C - например:
\n enter=newline \t = tab \r = enter \f = newpagetoprint \b backspace
Использование числовых значений кодировки unicode:
\u0037 = это то же самое, что символ '7' (цифры десятичные)
Расшифровка символов есть на сайте Unicode и на
розданном CD есть расшифровка для русского языка.
Чтобы спецсимвол не работал как спецсимвол, ставят косую черту:
char c = '\'' ; // тут в "c" поместили символ "одиночная кавычка"
Экзотика: Можно использовать и 8 и 16-ричную форму записи, например так:
a = 0x7B // записано 16-ричное число 7B
a = 0175 // записано 8-ричное число 175
---
Какие преобразования типов данных возможны?:
int x; // 4 byte длиной
byte y; // 1 byte длиной
x=y; // более короткое число "y 1 byte длиной" положили в место
// для длинного "x 4 byte длиной"
Наоборот тоже возможно, но компилятор будет ругаться.
Еще можно явно преобразовывать типы:
y=(byte)x; // сделать из 4-байтового числа "x" 1-байтовое
Аналогичные штуки работают для вещественных чисел.
double z = 7.8; Превратим вещ. z в целое
x=(int)z; // сработает, но пропадет хвостик 0.8
А если попытаться написать x=z; то компилирование не произойдет и байт-код не получиться. Наоборот, преобразование с удлинением места в памяти не обязательно указывать во что преобразовываем. То есть при таком безопасном преобразовании можно применить неявную форму записи преобразования. То есть в примере выше можно написать z=x;
П2.2.2. Математические операции
Все обычные операции
(кто не знает что такое % - это есть вычисление остатка от
целочисленного деления, например
10 % 3 -> получится 1 ,
10,2 % 3 -> тоже 1)
увеличить на число и результат положить в ту же ячейку-переменную, откуда брали. Сокращают запись:
а=а+5; то же самое что а+=5;
Аналогично пишут для - % * /
Инкремент, например а=а+1;
++а = сначала увеличиваем переменную, потом можем
воспользоваться хранящимся в ней значением.
а++ = наоборот, сначала можем воспользоваться хранящимся
в переменной значением, потом увеличиваем ее на единицу;
Пример:
int a=5, b;
b=++a; // это значит в b попала шестерка
// (сначала к 5 прибавилась 1, потом ее
// использовали для занесения в ячейку "6")
Аналогично есть "декремент"
--а или а--
(это все не сложно, нужно лишь привыкнуть и запомнить разные разности)
Сравнение
(результат будет булевского типа)
== ==
!= не равно
Пример
int a = 5;
int b = 6;
boolean c
c = а == b // в "с" будет-запишется false
Логические операции
|| или
! не
&& и
исчерпывающие примеры
true && true = true
true && false = false
false && true = false
false && false = false
true || true = true
true || false = true
false || true = true
false || false = false
!true = false
!false = true
Зачем это нужно? Для написания всяких сложных условий типа "если переменная А меньше того-то, но больше сего-то , тогда
П2.2.3. Исключительные ситуации (exeptions)
Прежде чем погибнуть по причине ошибки, программа создает "исключения". Это объекты - экземпляры какого-нибудь класса из подклассов java.lang.Throwable Класс Throwable содержит строку сообщения String. Много стандартных классов-наследников у Throwable.
Их (объекты-"исключения") можно перехватывать и обрабатывать, не давая совершиться чему-то страшному. Например вводим буквы вместо цифр в калькулятор. "Обработать искл.сит.", - значит понять что случилось, остановить программу и выдать сообщение, "не цифра!" например. Применяется конструкция
try{
тут кусок программы способный
привести к ошибкам
}catch(Exception e){
тут кусок программы "что делать"
когда ошибка произошла
}finally{
что делать дальше независимо от результатов обработки в catch
надеюсь далее будет пример
}
Имя "Exception" означает на самом деле ту самую искл. сит., которая произошла в классе, который мы вызвали из раздела Try{"тут кусок программы способный привести к ошибкам"}. Компилятор помнит, откуда был сделан вызов метода, далее в том же блоке try-catch приведшего к исключению, поэтому собственное имя искл.сит. не требуется, вполне годится общестандартное имя "Exception". Экземпляр класса Exception будет создан.
Исключительные ситуации можно создавать и искусственно. Для проверки неких условий. (оператор throw new "имя_Exception" <-[внутри try - catch]). Тут уже Исключ.сит. - это некий объект некоего нами названного класса (наследника класса "Exception"). И тут уже он (объект нашего класса-наследника) имеет собственное имя!
П2.3 Языковые конструкции Java
П2.3.1. Циклы
с предусловием
while (condition) {
do-some-actions; // if condition=false, ни разу действие не сделается
}
с после условием
do{
do-some-actions; // at least it'll be done once
} while (condition a verifier);
с перечислением
for (intitialisation; condition; modification){
do-some-actions;
}
Пример:
for (int i = 0; i < 7; i++){
можно на самом деле инициализировать одну переменную, а наращивать другую и проверять третью, а можно и вообще какое-то условие пропустить (но обязательно его указать пустым местом, то есть поставить соответствующую ему точку с запятой!. Как вы помните, i++ означает i=i+1
Еще можно перечислять несколько переменных в каждом разделе for оператор break можно использовать во всех этих циклах (его пишут предварив его if(условие) тогда break
Еще есть оператор continue - пропускает текущую итерацию и продолжает цикл. Пример
Пример:
for (int i=-3; i<3; i++){
if (i==0) continue; // нельзя делить на ноль
float a = 5/i; // вообще-то если в Java делить на ноль,
} // получиться спец_значение inf (некая константа
// равная самому большому числу из возможных
// вещественных чисел
Тут i живет только внутри цикла, а вот а - видна снаружи и после завершения цикла не пропадает. Пример однако глупый, потому что промежуточные значения а нигде не останутся.. но это только пример на циклы.
П2.3.2. Условный переход
Все программерство стоит на условных переходах вроде такого "если условие верно, то делай это, если нет - делай то" Короче говоря "Если.. то.." Или по иностранному (все как в языке C)
if (условие) {
действие; // действие м/б одно или куча
... // если действие одно, фигурные скобки можно не писать
действие;
}
Если действие одно-единственное, фигурные скобки можно не писать.
if (проверяемое условие или логическая переменная){
действие;
...
действие;
}else{
действие;
...
действие; // вместо действия могут быть вложенные if
}
Конструкция switch - выбор значений переменной из списка вариантов
switch (value){
case value1 : do_this;
break; // срочный выход из цикла
case value2 : do_this;
case value3 : разные операторы;
default : еще операторы ;
}
П2.3.3. Массивы
Это тоже объекты. В отличие от других типов, в библиотеке явно нет стандартного класса от Sun, из которых они создаются. Но оператор new используется и все делается похоже на создание других объектов.
1) Указывается тип данных которые будут храниться в ячейках массива и в ячейках можно будет хранить данные только одного этого типа.
int a[];
int[] a;
2) выделить память и указать сколько ячеек в массиве:
a=new int[5] ;
Все ячейки пронумерованы начиная с нуля. Обращаться к каждой можно используя квадратные скобки. А что тут объектного? Вот что: у объекта "массив" есть одно-единственное свойство length - длина массива в ячейках. Ее читают соответствующим методом-функцией. Длина обозначена числом типа int (long нельзя).
Массивы только одномерные. Подобие многомерности получается путем создания массива из массивов. В ячейке массива сидит массив (причем они разномерные и более того..)
Все массивы "динамические". Значит ли это, что они могут менять свою длину в процессе работы? НЕТ! Массив после создания можно только уничтожить (длина станет null). Слово "динамический" означает, что память под массив можно выделить в любом месте программы (а не заранее!) и память только в том месте программы - на том этапе работы программы - и выделится. Удобно вообще-то: если у вас огромный массив, то память он начнет загромождать не заранее, а только когда он понадобится.
Как еще можно создавать массивы? Можно сразу ему присвоить начальное значение. Длина будет такая, сколько значений указали:
int a[] = {7, 21, 85}; // слово new тут не нужнО
Многомерные массивы :
Объявим "массив с цифрами float в ячейках"
float a[][];
Инициализируем его:
float a[][] = new float [4][2]; // матрица 4 х 2
Разномерный массив:
float a[][] = new float [4][];
Не сказано какой длины будут висеть наборы ячеек из каждой из 4-х ячеек "первого" массива (массива массивов). Это первое new не выделяет память, а только создает некие указатели. Далее нужно написать для выделения памяти :
a[0] = new float[3]; - в первую ячейку положили массив длиной "три"...
Про массивы все. Очень нехарактерно для Java то, что в классе массив есть всего один метод. Есть еще класс Вектор, там методов полно, но есть и расплата - вектор медленно работает. Обычно в классах по не одному десятку методов.
П2.3.4. Подпрограммы
Все. Зачем все вышеназванное нужно? Все оно используется не само по себе, а внутри функций. ФУНКЦИЯ - группа операторов под общим ИМЕНЕМ. Обращаясь к ней по имени мы их все вызываем к работе. Может понятнее было бы назвать ПОДПРОГРАММОЙ. Отработав, операторы дают некий результат своей работы - его "функция" возвращает.
Чтобы вернуть результат, нужно указать заранее его тип. Итак функции пишут так:
data_type FunctionName (тип_арг1 имя_арг1, тип_арг2 имя_арг2, ... тип_аргN имя_аргN){
перечень действий-операторов, составляющих;
подпрограмму-функцию;
return(результат); // спец_оператор для возврата результата работы функции-подпрограммы
// return результат; - еще вариант записи оператора "возврат результата"
// этот оператор еще по совместительству завершает функцию (работу подпрограммы)
}
Результатов возвращаются не более одного. Бывает, что функция не должна ничего возвращать. Тогда используют специальный тип - void ;
Перед типом результата иногда пишут так наз. описание доступа (спецификатор доступа) - указывают кто может использовать данную. функцию. Об этом позже.
ПРИМЕР - некая функция для суммирования целых чисел.
int Sum(int x, int y){
return (x+y);
}
Аргументы простых типов передаются "по значению". Это значит, что внутри подпрограммы создаются копии переданных туда в качестве аргументов переменных, а сами эти переменные не изменяются. (((Если бы внутри функции использовались указатели - это было бы "по ссылке" .. На самом деле передача внутрь функции объектов производится "по ссылке" - об этом позднее. Еще раз: Объекты передаются по ссылке! (нужно внутрь некоторого объекта, в его функцию, передать посторонний объект со всеми его переменными=полями и их значениями... Передается лишь ссылка на этот объект. Внутри области нашего первого объекта НЕ выделяется память, не создается в ней копия постороннего передаваемого объекта.)))
Внутри функции-подпрограммы можно объявлять переменные - они есть "локальные". Когда функция начала работать, этим переменным отведется место в памяти компутера, но как только она перестанет работать (завершится), то эта переменная из памяти уничтожится. И вне функции она будет не видна все время работы функции.
В обычном программировании вы еще слышали "глобальную" переменную. Тут этого термина нет, но считайте что все переменные объявленные вне функции - "глобальные". Они называются на самом деле "полями" - об этом позднее!
int Sum(int x, int y){
int rez; // локальная
rez = x + y;
return (rez);
}
ПЕРЕГРУЗКА функции
Это просто. В программе можно объявить несколько функций с одинаковыми именами, различающиеся только списком аргументов. Этот список должен быть разным обязательно. Разница м/б как в количестве, так и в их типе. Очень популярный механизм. Буквально каждая функция имеет несколько однофамильцев. Например мы хотим суммировать не только целые, но и вещественные числа. А язык-то жестко типизированный. Вот и пригодится перегрузка:
float Sum(float x, float y){
return (x+y);
}
Если при вызове функции я указал вещественное, то вызовется Sum-вещественная, а если целые - Sum-цел.
float a=Sum(5, 6);
a = Sum(5,2, 6);
Пример не ахти какой, так как возможно безопасное преобразование типов... Но идея ясна. Очень это распространено, среди матем. библ. функций..
Функции не живут сами по себе в java-программировании. Они живут внутри КЛАССОВ.
П2.4. Объектно-ориентированное программирование (ООП).
Зачем нужно? Чтобы экономит силы и использовать объектный код, сочиненный другими людьми. Сама Java -программа - это некий объект. Главное понятие в ООП - понятие класса. Это структура (сложный тип данных), объединяющая переменные и функции для работы с ними.
Класс "мыша"
Mouse{
x // переменные внутри класса - "поля" или
y // "свойства"
draw() // функция внутри класса = "метод"
}
Формальное описание синтаксиса класса:
class Name {
int x, y;
тело класса;
int Sum (int a, int b){} // описание функций
float z; // в любом порядке описание переменных и функций..
// хотя для читабельности все лучше по порядку
}
Класс не похож на функцию, не возвращает никакого значения.
Тут используют описания доступа к переменным (полям то есть) класса и к его функциям (методам то есть). По умолчанию переменные и функции доступны для своего класса и всех его соседей в той же папке.
По сути класс - что это? Это сложная структура в памяти. Выделяем 4 байта для целого, 4 байта для вещественного, и описываем структуру функции для работы с ними. Но это лишь описание - реально память не выделена. Память выделяется реально - создается объект. То есть конкретный экземпляр класса. Я месяца три после процедурного программирования не мог привыкнуть к терминологии и не мог понять, зачем же это нужно! Попытаюсь вам объяснить все же побыстрее :-)
Класс "люди"
голова
руки
метод_думать (увеличивает значение голова на 1)
метод хватать (увеличивает значение рук на 1)
все
Мы все - объекты=экземпляры этого класса. Нам выделено место на земле чтобы жить, хватать и думать.
Внутри класса помимо всего прочего существует специальная функция - "конструктор" - называется функция тем же именем, что и класс (в этом примере - "люди"). Она может существовать или не существовать. Она не возвращает никакого результата и void к конструктору не надо приписывать. Она - функция-конструктор - нужна для некоторых начальных (инициализирующих) действий при создании объекта. Какие действия? Разные..
В нашем примере: конструктор присвоит головам и рукам значение "десять". Это я придумываю сам. Пусть будет так. Или пример с мышой: пусть мыша будет при инициализации располагаться в центре экрана. Кто-то должен вычислить координаты центра экрана и вызвать функцию рисования чтобы там мыша была нарисована.
Когда объект создается (человек рождается), то вызывается один-единственный раз конструктор. Если я не описал спец. конструктор, то что по умолчанию? Обычно ничего. Но если и ничего, все же по умолчанию конструктор есть. Хотя по умолчанию он ничего не совершает, ничего не возвращает, никаких аргументов не получает.
Вернемся к примеру Люди: создаем объект Миша класса Люди -
1) объявили переменную сложного типа "Люди" (так как мы писали int a;
при объявлении переменной простого типа)
Люди Миша; // никакая память не выделилась, переменной
// спец_типа Люди - нет, ее "значение" - null
// в отличие от случая простой переменной - она то
// "инициализируется" автоматически
2) выделили оперативную память для объекта Миша:
Миша=new Люди();
Теперь возник кусок выделенной памяти - конструктор там создал структуру для хранения переменных руки, голова, функций-методов.
Разница с обычным программированием: функция делается менее универсальной. Она может работать только над данными данного объекта! Нельзя заставить функцию-метод объекта взять переменную другого объекта. (можно ей передать извне эти переменные-поля как аргументы). Зато (выигрыш) все это дело увязано в одну взаимосвязанную структуру. Еще раз: даже если метод-функцию вызвать снаружи, она чужие данные не сможет взять. А как же передают данные внутрь переменных-полей объекта? Прямой записью в поле или передачей данных внутрь через функцию-метод, ему эти данные дают в качестве аргумента.
Уничтожение объектов. В отличие от Си++ в Java нет Деструктора. Я пишу
Миша = null;
Объект "Миша" не сразу убивается-освобождает память. Он просто лежит тут, ненужный Миша. А потом, в момент регулярной чистки памяти, его уберут. Java -машина чистит память регулярно.
Приложение 3
Листинг программы – SearchEngein.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.*;
// Класс Интерфейс
public class SearchEngein extends HttpServlet {
// Объявление глобальных переменных
Properties INIProperties = new Properties();
String query = null, // Запрос
value = null; // Запрос в нужной кодировке
String dbname, // Имя базы
dbpath; // Путь к базе
String dbselect; //
byte MD = 30, // Код разделителя
MD2 = 31; // Код разделителя
String RusDos = new String("Cp866"); // Кодировка дос
String RusWin = new String("windows-1251"); // Кодировка Виндовс
String iso = new String("8859_1"); // Кодировка Сервлета
String RusIso = new String("8859-5"); // Кодировка Исо
// конвертор кодировки из ИСО В Виндовс
private String ConvertISO(String Str) {
try {
Str = new String( Str.getBytes(iso),RusWin);}
catch( java.io.UnsupportedEncodingException e ) { return Str;}
return Str;
}
public String getServletInfo() {
return "Поиск в базе данных ";
}
private String RemoveTrash(String str){
return new String(str);
}
// преобразование в нижний регистр
public String toLow(String str){
char old[] = str.toCharArray();
char news[] = new char[str.length()];
char c;
for (int i =0; i c = old[i]; switch (c) { case 'А' : {c = 'а';break;} case 'Б' : {c = 'б';break;} case 'В' : {c = 'в';break;} case 'Г' : {c = 'г';break;} case 'Д' : {c = 'д';break;} case 'Е' : {c = 'е';break;} case 'Ё' : {c = 'ё';break;} case 'Ж' : {c = 'ж';break;} case 'З' : {c = 'з';break;} case 'И' : {c = 'и';break;} case 'Й' : {c = 'й';break;} case 'К' : {c = 'к';break;} case 'Л' : {c = 'л';break;} case 'М' : {c = 'м';break;} case 'Н' : {c = 'н';break;} case 'О' : {c = 'о';break;} case 'П' : {c = 'п';break;} case 'Р' : {c = 'р';break;} case 'С' : {c = 'с';break;} case 'Т' : {c = 'т';break;} case 'У' : {c = 'у';break;} case 'Ф' : {c = 'ф';break;} case 'Х' : {c = 'х';break;} case 'Ц' : {c = 'ц';break;} case 'Ч' : {c = 'ч';break;} case 'Ш' : {c = 'ш';break;} case 'Щ' : {c = 'щ';break;} case 'Ъ' : {c = 'ъ';break;} case 'Ы' : {c = 'ы';break;} case 'Ь' : {c = 'ь';break;} case 'Э' : {c = 'э';break;} case 'Ю' : {c = 'ю';break;} case 'Я' : {c = 'я';break;} default : {news[i]=c;} }// switch news[i] = c; } return new String(news); } // private String TagRemove(String s){ boolean inTag = false; boolean tag = false; int sn = 0; char c; int m = s.length(); char[] cd = new char[m]; char[] old = s.toCharArray(); char cMD = (char) MD2; for (int i=0; i {c=old[i]; if (tag) { c=' '; tag = false; } else if ( c == cMD ) { c=' '; tag = true;} cd[i] = c; } return new String(cd); } // public void dbFileRead(String dbNamePath, PrintStream out, String query) { String mAvtor = null; // 100 String msAvtor = null; // 700 String mName = null; // 245 String mPrinter = null; // 260 String mSize = null; // 300 String mKey = null; // 653 String mSeria = null; // 490 String mBBK = null; // 91 String mKaIndex = null; // 90 long fPosMarker = 0, // Позиция относительно начала fPosData = 0; // boolean done = false, Avtor = false; int mC =0, mE =0; // Счетчик byte Jumper[] = new byte[5]; // Размер запяси - символьный int JIndex = 0, // Размер запяси - числовой JTemp = 0, // Размер данных + словарь MIndex = 0, // Счетчик для массива MTemp = 0; // Счетчик полей if (query != null){ try { RandomAccessFile dbfile = new RandomAccessFile(dbNamePath,"r"); // Цикл чтения файла по маркерам while (fPosMarker != dbfile.length()) { try { mC++; dbfile.seek(fPosMarker); dbfile.read(Jumper); String jBuf = new String(Jumper); JIndex = Integer.parseInt(jBuf,10); int b = 0; // Поиск конца словаря while ( b != MD){ dbfile.seek(fPosMarker+24+MIndex); b = dbfile.read(); MTemp++; MIndex = MTemp; } MTemp= MTemp - 1; // чтение Словаря из файла в отдельный массив byte Dic[] = new byte[MTemp]; dbfile.seek(fPosMarker+24); dbfile.read(Dic); // чтение полей данных из файла в массив fPosData = fPosMarker+24+MTemp; String sDic = new String(Dic); byte MarcRec[] = new byte[JIndex-24-MTemp]; dbfile.seek(fPosData); dbfile.read(MarcRec); int DI2 = 0, DI3 = 0, DI4 = 0, DI5 = 0, PNum = 0, // Номер поля числовой PLength = 0, // Длинна поля числовая PStart = 0; // Начальная позиция поля чиловая // сканирование номеров полей while ( DI2 != MTemp){ DI3=DI2+3; String DStr = sDic.substring(DI2,DI3);// Номер поля DI4=DI3+5; String DStr2 = sDic.substring(DI3,DI4);// Начальная позиция DI5=DI4+4; String DStr3 = sDic.substring(DI4,DI5);// Длинна поля DI2=DI2+12; PLength = Integer.parseInt(DStr3,10);// Узнаем длинну поля PStart = Integer.parseInt(DStr2,10);// Узнаем начало поля PNum = Integer.parseInt(DStr,10);// Код byte Pole[] = new byte[PLength]; // Чтение поля из файла for (int PIndex = 0; PIndex < PLength; PIndex++) { Pole[PIndex] = MarcRec[PStart+PIndex]; } String Pol = new String(Pole); if (Pol == null) Pol=" "; switch (PNum) { case 100 : { mAvtor = TagRemove(Pol.substring(5));break;} case 700 : { msAvtor = TagRemove(Pol.substring(5));break;} case 245 : { mName = TagRemove(Pol.substring(5));break;} case 490 : { mSeria = TagRemove(Pol.substring(5));break;} case 91 : { mBBK = TagRemove(Pol.substring(5));break;} case 90 : { mKaIndex = TagRemove(Pol.substring(5));break;} case 260 : { mPrinter = TagRemove(Pol.substring(5));break;} case 300 : { mSize = TagRemove(Pol.substring(5));break;} case 653 : { mKey = TagRemove(Pol.substring(5));break;} default : {} }// switch }// конец проверки полей if ( mAvtor == null) mAvtor=" "; if ( msAvtor == null) msAvtor=" "; if ( mName == null) mName=" "; if ( mPrinter == null) mPrinter=" "; if ( mSize == null) mSize=" "; if ( mKey == null) mKey=" "; MarcRecord Rec = new MarcRecord( mAvtor, msAvtor, mName, mPrinter, mSize, mKey, mSeria, mBBK, mKaIndex); if ( Rec.rAvtor.indexOf(query) != -1 || Rec.rsAvtor.indexOf(query) != -1 || Rec.rName.indexOf(query) != -1 || Rec.rKey.indexOf(query) != -1) { mE++; out.println(" ""+
"+
"
""+
Rec.rAvtor+" "+
Rec.rsAvtor+
"
"
" Название: "+
Rec.rName+"
"+
Rec.rPrinter+" "+
Rec.rSize+"
"+
Rec.rBBK+" "+
Rec.rKaIndex+" "+
Rec.rSeria+
"");
}
fPosMarker = fPosMarker+JIndex;
MTemp = 0;
MIndex = 0;
}
catch (IOException e) {
out.println("Ошибка!!!"+"
");
done=true; }
}
}
catch (IOException e) { out.println("Ошибка доступа к "+dbNamePath); }
if (mE == 0) {
out.println("Запос: "+query+" не найден");
}
} // end If
}
// Ридер файла настройки
public void INIFile(String filename, String directory, PrintStream out) {
DataInputStream inifile = null;
String path = null,
iniRecord = null,
section = null,
vname = null,
vvalue = null;
boolean done = false;
int equalIndex = 0;
//
if (filename.length() == 0) {
out.println("IOError ");
System.exit(0);
}
if (directory.length() == 0) { directory = new String("c:\\www\\db"); }
if (filename.indexOf(".") < 0) { filename = new String(filename+".ini"); }
path = new String(directory+System.getProperty("file.separator")+filename);
// открытие файла
try { inifile = new DataInputStream(new FileInputStream(path)); }
catch(FileNotFoundException e) {
out.println(filename+"not found");
System.exit(0);
}
// чтение файла
try { iniRecord = inifile.readLine(); }
catch (IOException e) { done=true; }
while (!done && iniRecord != null)
{ if (iniRecord.startsWith("["))
{ section = iniRecord.substring(1,iniRecord.lastIndexOf("]"));}
else if (!iniRecord.startsWith(";"))
{ equalIndex = iniRecord.indexOf("=");
if (equalIndex > 0)
{ //Имя ключа => Раздел.ключ
vname = new String(section+"."+iniRecord.substring(0,equalIndex));
vvalue = new String(iniRecord.substring(equalIndex+1));
INIProperties.put(vname, vvalue);
}
}
try { iniRecord = inifile.readLine(); }
catch (IOException e) { done=true; }
}
}
// извлечь значение
public String getINIVar(String key, String defValue) {
return INIProperties.getProperty(key, defValue);
}
// извлечь значение
public String getINIVar(String key) {
return INIProperties.getProperty(key);
}
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
PrintStream out;
out = new PrintStream(res.getOutputStream());
res.setContentType("text/html; charset=Cp866");
// Печать заголовка
printPageHeader(out);
INIFile("db.ini","c:\\www\\db",out);
// Определяем кодировку
String requestEnc = req.getCharacterEncoding();
String clientEnc = requestEnc;
if ( requestEnc==null ) requestEnc=iso;
requestEnc=iso;
// Тело
out.println("");
out.println("");
out.println("
out.println("
out.println("
out.println("
out.println("
out.println(" ");
out.println("
out.println("
out.println(" ");
out.println(" ");
out.println("
out.println(" ");
out.println(" "+ConvertISO(getINIVar("KATALOG.Book"))+"");
out.println(" "+ConvertISO(getINIVar("KATALOG.Stat"))+"");
out.println(" "+ConvertISO(getINIVar("KATALOG.Periud"))+"");
out.println(" "+ConvertISO(getINIVar("KATALOG.Podpis"))+"");
out.println(" "+ConvertISO(getINIVar("KATALOG.Ucheb"))+"");
out.println(" ");
out.println(" ");
out.println("
out.println(" ");
out.println(" ");
out.println(" ");
out.println(" ");
out.println(" ");
// Конец тела
// Взять текст из строки
query = req.getParameter("Query");
if (query == null || query.length()<1)
{
printPageFooter(out);
return;
}
dbselect = req.getParameter("select");
value = new String(ConvertISO(query));
// Чтение файла
dbFileRead(getINIVar(dbselect), out, value);
// Распечатка результата
printPageFooter(out);
query = null;
value = null;
}
// Вывод заголовка документа
private void printPageHeader(PrintStream out) {
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
out.println("");
}
private void printPageFooter(PrintStream out) {
out.println("");
out.println("");
out.flush();
}
}
// Класс Запясь для хранения данных считаных из запяси
class MarcRecord {
protected String rAvtor; // Поле автор
protected String rsAvtor; // Поле соавтор
protected String rName; // Поле название произведения
protected String rPrinter; // Поле издатель
protected String rSize; // Поле Объем издания
protected String rKey; // Поле ключевые слова
protected String rSeria;
protected String rBBK;
protected String rKaIndex;
MarcRecord( String r1,
String r2,
String r3,
String r4,
String r5,
String r6,
String r8,
String r11,
String r12) {
rAvtor = r1;
rsAvtor = r2;
rName = r3;
rPrinter = r4;
rSize = r5;
rKey = r6;
rSeria = r8;
rBBK = r11;
rKaIndex = r12;
}
}
Приложение 4
Результаты тестирования программы
Тестирование программы проводилось на 4 массивах данных размером 1000, 5000, 8366, 10000 записей. Метод тестирования заключался в поиске последней записи массива по уникальному названию, чтобы определить время поиска по всему массиву. Полученные данные приведены в таблице и на основе данных построен график (см. график).
График
111
3>1>