Шрифт:
// отобразить справочную информацию по заданной теме 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); }
} ``` Упражнение для самопроверки
по материалу главы 10
Для чего в Java определены как байтовые, так и символьные потоки?
Как известно, ввод-вывод данных на консоль осуществляется в текстовом виде. Почему же в Java для этой цели используются байтовые потоки?
Как открыть файл для чтения байтов?
Как открыть файл для чтения символов?
Как открыть файл для ввода-вывода с произвольным доступом?
Как преобразовать числовую строку "123.23" в двоичный эквивалент?
Напишите программу, которая будет копировать текстовые файлы. Видоизмените ее таким образом, чтобы все пробелы заменялись дефисами. Используйте при написании программы классы, представляющие байтовые потоки, а также традиционный способ закрытия файла явным вызовом метода close .
Перепишите программу, созданную в ответ на предыдущий вопрос, таким образом, чтобы в ней использовались классы, представляющие символьные потоки. На этот раз воспользуйтесь оператором try с ресурсами для автоматического закрытия файла.
К какому типу относится поток System. in?
Что возвращает метод read из класса InputStream по достижении конца потока?
Поток какого типа используется для чтения двоичных данных?
Классы Reader и Writer находятся на вершине иерархии классов _ .
Оператор try без ресурсов служит для __ .
Если для закрытия файла используется традиционный способ, то это лучше всего делать в блоке finally. Верно или неверно?
Глава 11 Многопоточное программирование
Основные навыки и понятия
Общее представление о многопоточной обработке
Класс Thread и интерфейс Runnable
Создание потока
Создание нескольких потоков
Определение момента завершения потока