Пример для опробования 10.2.Создание справочной системы, находящейся на диске
В примере для опробования 4.1 был создан классHelp, позволяющий отображать сведения об операторах Java. Справочная информация хранилась в самом классе, а пользователь выбирал требуемые сведения из меню. И хотя такая справочная система выполняет свои функции, подход к ее разработке был выбран далеко не самый лучший. Так, если требуется добавить или изменить какие-нибудь сведения в подобной справочной системе, придется внести изменения в исходный код программы, которая ее реализует. Кроме того, выбирать пункт меню по его номеру не очень удобно, а если количество пунктов велико, то такой способ оказывается вообще непригодным. В этом проекте предстоит устранить недостатки, имеющиеся в справочной системе, разместив справочную информацию на диске.
В новом варианте справочная информация должна храниться в файле. Это будет обычный текстовый файл, который можно изменять, не затрагивая исходный код программы. Для того чтобы получить справку по конкретному вопросу, следует ввести название темы. Система будет искать соответствующий раздел в файле. Если поиск завершится успешно, справочная информация будет выведена на экран.
Последовательность действий
Создайте файл, в котором будет храниться справочная информация и который будет использоваться в справочной системе. Это должен быть обычный текстовый файл, организованный следующим образом:```название_темы_1
Информация по теменазвание_темы_2
Информация по теменазвание_темы_N
Информация по теме2. Название каждой темы располагается в отдельной строке и предваряется символом #. Наличие специального символа в строке (в данном случае — #) позволяет программе быстро найти начало раздела. Под названием темы может располагаться любая справочная информация. После окончания одного раздела и перед началом другого должна быть введена пустая строка. Кроме того, в конце строк не должно быть лишних пробелов.3. Ниже приведен пример простого файла со справочной информацией, который можно использовать вместе с новой версией справочной системы. В нем хранятся сведения об операторах Java.if
if(condition) statement; else statement;switch
switch(expression) { case constant: statement sequence break; // ... }for
for(init; condition; iteration) statement;while
while(condition) statement;do
do { statement; } while (condition);break
break; or break label;continue
continue; or continue label;4. Присвойте этому файлу имя helpfile.txt.5. Создайте файл FileHelp.java.6. Начните создание новой версии класса Help со следующих строк кода:
class Help { String helpfile; // Имя файла со справочной информациейHelp(String fname) { helpfile = fname;
}7. Имя файла со справочной информацией передается конструктору класса Help и запоминается в переменной экземпляра helpfile. А поскольку каждый экземпляр класса Help содержит отдельную копию переменной helpf ile, то каждый из них может взаимодействовать с отдельным файлом. Это дает возможность создавать отельные наборы справочных файлов на разные темы.8. Добавьте в класс Help метод helpon (), код которого приведен ниже. Этот метод извлекает справочную информацию по заданной теме.
// отобразить справочную информацию по заданной теме boolean helpon(String what) { int ch; String topic, info;// открыть справочный файлtry (BufferedReader helpRdr = new BufferedReader(new FileReader(helpfile))){ do { // читать символы до тех пор, пока не встретится знак # ch = helpRdr.read(); // а теперь проверить, совпадают ли темы if(ch == '#') { topic = helpRdr.readLine(); if(what.compareTo(topic) == 0) { // found topic do { info = helpRdr.readLine(); if(info != null) System.out.println(info); } while((info != null) && (info.compareTo("") != 0)); return true; } } } while(ch != -1);}catch(IOException exc) { System.out.println("Error accessing help file."); return false;}return false; // тема не найдена
}9. Прежде всего обратите внимание на то, что в методе helpon () обрабатываются все исключения, связанные с вводом-выводом, поэтому в заголовке метода не указано ключевое слово throws. Благодаря такому подходу упрощается разработка методов, в которых используется метод helpon (). В вызывающем методе достаточно обратиться к методу helpon (), не заключая его вызов в блок try/catch.10. Для открытия файла со справочной информацией служит класс FileReader, оболочкой которого является класс Buf feredReader. В справочном файле содержится текст, и поэтому справочную систему удобнее локализовать через символьные потоки ввода-вывода.11. Метод helpon (\ действует следующим образом. Символьная строка, содержащая название темы, передается этому методу в качестве параметра. Метод открывает сначала файл со справочной информацией. Затем в файле производится поиск, т.е. проверяется совпадение содержимого переменной what и названия темы. Напомним, что в файле заголовок темы предваряется символом #, поэтому метод сначала ищет данный символ. Если символ найден, производится сравнение следующего за ним названия темы с содержимым переменной what. Если сравниваемые строки совпадают, то отображается справочная информация по данной теме. И если заголовок темы найден, то метод helpon () возвращает логическое значение true, иначе — логическое значение false.12. В классе Help содержится также метод getSelectionO, который предлагает задать тему и возвращает строку, введенную пользователем.
// получить тему String getSelectionO { String topic = "";BufferedReader br = new BufferedReader( new InputStreamReader(System.in));System.out.print("Enter topic: ") ;try { topic = br.readLine();}catch(IOException exc) { System.out.println("Error reading console.");}return topic;
}13. В теле этого метода сначала создается объект типа Buf feredReader, который связывается с потоком вывода System, in. Затем в нем запрашивается название темы, которое принимается и далее возвращается вызывающей части программы.14. Ниже приведен весь исходный код программы, реализующей справочную систему, находящуюся на диске.
/* Пример для опробования 10.2.Справочная система, находящаяся на диске.Для компиляции этой программы требуется JDK 7или более поздняя версия данного комплекта.
/ import java.io.;
/ В классе Help открывается файл со справочной информацией, производится поиск названия темы, а затем отображается справочная информация по этой теме. Обратите внимание на то, что в этом классе поддерживаются все исключения, освобождая от этой обязанности вызывающий код. / class Help { String helpfile; // Имя файла со справочной информациейHelp(String fname) { helpfile = fname;}// отобразить справочную информацию по заданной темеboolean helpon(String what) { int ch; String topic, info; // открыть справочный файл try (BufferedReader helpRdr = new BufferedReader(new FileReader(helpfile))) { do { // читать символы до тех пор, пока не встретится знак # ch = helpRdr.read(); // а теперь проверить, совпадают ли темы if(ch =='#') { topic = helpRdr.readLine(); if(what.compareTo(topic) == 0) { // тема найдена do { info = helpRdr.readLine(); if(info != null) System.out.println(info); } while((info != null) && (info.compareTo("") != 0)); return true; } } } while(ch != -1); } catch(IOException exc) { System.out.println("Error accessing help file."); return false; } return false; // тема не найдена}// получить темуString getSelection() { String topic = ""; BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Enter topic: "); try { topic = br.readLine(); } catch(IOException exc) { System.out.println("Error reading console."); } return topic;}
}
// продемонстрировать справочную систему, находящуюся на диске class FileHelp { public static void main(String args[]) { Help hlpobj = new Help("helpfile.txt"); String topic; System.out.println("Try the help system. " + "Enter ’stop' to end."); do { topic = hlpobj.getSelection (); if(!hlpobj.helpon(topic)) System.out.println("Topic not found.\n"); } while(topic.compareTo("stop") != 0);}