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("<table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"+
"<tr bgcolor=\"#3399FF\">"+
"<td colspan=\"3\" class=\"text\"> Автор: "+
"<font color=\"#000000\">"+
Rec.rAvtor+" "+
Rec.rsAvtor+
"</font></td></tr><tr>"+
"<td colspan=\"3\" valign=\"top\" class=\"bodytext\">"+mE+". "+mC+
" <b>Название:</b> "+
Rec.rName+"<br>"+
Rec.rPrinter+" "+
Rec.rSize+"<br>"+
Rec.rBBK+" "+
Rec.rKaIndex+" "+
Rec.rSeria+
"</td></tr></table>");
}
fPosMarker = fPosMarker+JIndex;
MTemp = 0;
MIndex = 0;
}
catch (IOException e) {
out.println("Ошибка!!!"+"<br>");
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("<body bgcolor=\"#FFFFFF\">");
out.println("<form method=\"get\" action=\"/serv/SearchEngein\">");
out.println(" <table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
out.println(" <tr bgcolor=\"#3399FF\"> ");
out.println(" <td width=\"266\" class=\"text\"> Запрос</td>");
out.println(" <td width=\"135\" class=\"text\"> Каталог</td> ");
out.println(" <td width=\"207\"> </td>");
out.println(" </tr>");
out.println(" <tr>");
out.println(" <td width=\"266\" valign=\"top\"> ");
out.println(" <input type=\"text\" name=\"Query\" maxlength=\"100\" size=\"38\" value=\"\">");
out.println(" </td>");
out.println(" <td width=\"135\" valign=\"top\"> ");
out.println(" <select name=\"select\" size=\"1\">");
out.println(" <option value=\"MARCFILE.Book\" selected>"+ConvertISO(getINIVar("KATALOG.Book"))+"</option>");
out.println(" <option value=\"MARCFILE.Stat\">"+ConvertISO(getINIVar("KATALOG.Stat"))+"</option>");
out.println(" <option value=\"MARCFILE.Periud\">"+ConvertISO(getINIVar("KATALOG.Periud"))+"</option>");
out.println(" <option value=\"MARCFILE.Podpis\">"+ConvertISO(getINIVar("KATALOG.Podpis"))+"</option>");
out.println(" <option value=\"MARCFILE.Ucheb\">"+ConvertISO(getINIVar("KATALOG.Ucheb"))+"</option>");
out.println(" </select>");
out.println(" </td>");
out.println(" <td width=\"207\" valign=\"top\"> ");
out.println(" <input type=\"submit\" name=\"Start\" value=\"Поиск\">");
out.println(" </td>");
out.println(" </tr>");
out.println(" </table>");
out.println(" </form>");
// Конец тела
// Взять текст из строки
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("<html>");
out.println("<head>");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Cp866\">");
out.println("<style type=\"text/css\">");
out.println("<!--");
out.println(".text { font: bold 12px Arial, Helvetica, sans-serif; color: #0000FF; text-decoration: none; text-align: left; }");
out.println(".bodytext { font: 12px Arial, Helvetica, sans-serif; color: #000000; text-decoration: none; text-align: left; }");
out.println("-->");
out.println("</style>");
out.println("</head>");
}
private void printPageFooter(PrintStream out) {
out.println("</body>");
out.println("</html>");
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 массивах данных размером 1000, 5000, 8366, 10000 записей. Метод тестирования заключался в поиске последней записи массива по уникальному названию, чтобы определить время поиска по всему массиву. Полученные данные приведены в таблице и на основе данных построен график (см. график).
График