И.Н. Блинов, В.С. Романчик - Основы программирования на языке Java (1160783), страница 6
Текст из файла (страница 6)
Поток рассматривается приэтом как массив байт, доступ к элементам осуществляется с помощьюметода seek(long poz). Для создания потока можно использовать одиниз конструкторов:RandomAccessFile(String name, String mode);RandomAccessFile(File file, String mode);Параметр mode равен "r" для чтения или "rw" для чтения и записи.// пример #7 : запись и чтение из потока : RandomFiles.javaimport java.io.*;public class RandomFiles {public static void main(String[] args){int dataArr[] = {12, 31, 56, 23, 27, 1, 43, 65, 4, 99} ;try {RandomAccessFile rf = new RandomAccessFile("temp.dat", "rw");for (int i = 0; i < dataArr.length; i++)rf.writeInt(data_arr[i]); // запись в файлfor (int i = dataArr.length - 1; i >= 0; i--) {rf.seek(i*4); // длина каждой переменной типа int 4 байтаSystem.out.println(rf.readInt());// чтение в обратном порядке}rf.close();} catch (IOException e){System.out.println("ошибка доступа к файлу: " + e);}}}Предопределенные потокиКласс System пакета java.lang содержит поля InputStream in,PrintStream out, err, объявленные со спецификаторами public static иявляющиеся стандартными потоками ввода, вывода и вывода ошибоксоответственно.
Эти потоки связаны с консолью, но могут быть переназначены на другое устройство. В настоящее время для консольноговвода используется не байтовый, а символьный поток. При этом дляввода используется подкласс BufferedReader абстрактного классаReader и методы read() и readLine() чтения символа и строки.Следующая программа демонстрирует ввод строки, числа и символа сконсоли и вывод на консоль и в файл.34// пример #8 : ввод с консоли : ConsoleInput.javaimport java.io.*;public class ConsoleInput {public static void main(String[] args){InputStreamReader is = new InputStreamReader(System.in);BufferedReader bistream = new BufferedReader(is);try {char c;int number;System.out.println("введите имя и нажмите <ввод>:");String nameStr = bistream.readLine();System.out.println(nameStr+" введите число:");String numberStr = bistream.readLine();number = Integer.valueOf(numberStr).intValue();System.out.println(nameStr+" вы ввели число "+number);System.out.println(nameStr+" введите символ:");с = (char)bistream.read();System.out.println(nameStr+" вы ввели символ "+c);//Вывод в файлPrintStream ps=new PrintStream(new FileOutputStream ("res.txt"));ps.println("привет "+nameStr+c+number);ps.close();}catch (IOException e){System.out.println("ошибка ввода "+ e); }}}Для вывода данных в файл в текстовом формате использовалсяфильтрованный поток вывода PrintStream и метод println().
МетодvalueOf(String str) возвращает объект класса Integer, соответствующий цифровой строке, метод intValue() преобразует значение этогокласса к базовому типу int.Упражнения1. Создать и заполнить файл случайными целыми числами. Отсортироватьсодержимое файла по возрастанию и результаты вывести на консоль.2. Прочитать текст Java-программы и все слова "public" в объявлении атрибутов класса заменить на "private".3. Прочитать текст Java-программы и записать в другой файл в обратном порядке символы каждой строки.4.
Прочитать текст Java-программы и в каждом слове длиннее двух символоввсе строчные символы заменить прописными. Результат записать в другой файл.5. В файле, содержащем фамилии студентов и их оценки, записать большимибуквами фамилии тех студентов, которые имеют средний балл более "4".356. Файл содержит символы, слова, целые числа и числа с плавающей запятой.Прочитать из файла и вывести на консоль все данные, тип которых вводится изкомандной строки.7. Из файла удалить все слова, содержащие от трех до пяти символов, но приэтом из каждой строки должно быть удалено только максимальное четное количество таких слов.8.
Прочитать текст Java-программы и удалить из него все "лишние" пробелы,оставив только один значащий.9. Из текста Java-программы удалить все виды комментариев.10. Прочитать строки из файла и поменять местами первое и последнее словов каждой строке, записать в тот же файл.7.ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙИсключения представляют собой классы, объекты которых создаются в случае ошибки при выполнении какой-либо функции. Исключения являются наследниками суперкласса Throwable и его подклассов Error и Exception из пакета java.lang.
Часто используется подкласс RuntimeException класса Exception и его наследники:ArithmeticException,ArrayStoreException,ClassCastException,IllegalArgumentException,IllegalMonitorStateException,IndexOutOfBoundsException, SecurityException.Обычно используется один из трех подходов обработки исключений: перехват и обработка исключения; объявление исключений всекции throws метода и передача вызывающему методу; перехват исключения, преобразование его к другому классу и повторный вызов.При вводе/выводе используется класс IOException. Например:void doRead(){try{System.in.read(buffer); }catch (IOException e) {String err = e.toString(); System.out.println(err);}}Метод doRread() в блоке try пытается ввести данные из потокаSystem.in в буфер, если возникает ошибка, она обрабатывается в блоке catch.
Иначе блок catch пропускается. Исключение IOExceptionвозбуждается методом read(): public int read() throws IOException;Если блок try-catch опустить, компилятор укажет на ошибку.Если метод может генерировать исключения, которые сам не обрабатывает, он должен объявить о таком поведении с помощью ключевого слова throws, чтобы вызывающие методы могли защитить себяот этих исключений. Форма объявления:36тип имя_метода(список аргументов) throws список_исключений { }При этом сам объявляемый метод может содержать блоки try-catch, аможет и не содержать их. Например, метод doRead() можно объявить:void doRead() throws IOException{System.in.read(buffer);}Обрабатывать исключение будет метод, вызывающий doRead():void myDoRead(){try {doRead(); }catch (IOException e){String err = e.toString();System.out.println(err); }}Метод может обрабатывать несколько исключений.// пример #1 : обработка 2-х типов исключений :TwoException.javaclass TwoException {public static void main(String[] args) {try {int a = args.length;System.out.println("a = " + a);int b = 10 / a;int c[] = { 10 };c[10] = 11;}catch(ArithmeticException e){System.out.println("деление на 0: "+ e);}catch(ArrayIndexOutOfBoundsException e) {System.out.println("превышение границ массива: " + e); }System.out.println("после блока try/catch .");}}Исключение "деление на 0" возникнет при запуске без аргументовкомандной строки (а = 0).
При наличии аргумента командной строкивызовется исключение "превышение границ массива".Подклассы исключений должны следовать перед любым из их суперклассов, иначе суперкласс перехватит исключения. Например:catch(Exception e){/*код*/} //суперкласс Exception перехватитcatch(ArithmeticException e) {/*код*/}//не сработаетОператоры try можно вкладывать друг в друга. Если у оператораtry низкого уровня нет раздела catch, соответствующего возбужден37ному исключению, поиск будет развернут на одну ступень выше, ибудут проверены разделы catch внешнего оператора try.// пример #2 : вложенные блоки try-catch : MultiTryCatch.javapublic class MultiTryCatch {static void method() {try {int array[] = { 1 };array[10] = 5;} catch(ArrayIndexOutOfBoundsException e) {System.out.println("выход за границы массива: " + e);}}public static void main(String[] args) {try {int a = args.length();System.out.println("a = " + a);a -= 999 / a;method();} catch (ArithmeticException e) {System.out.println("деление на 0: " + e);}}}Оператор throwОператор throw используется для генерации исключения.
Для этого нужно иметь объект подкласса класса Throwable. Общая форма:throw ОбъектThrowable;При достижении этого оператора выполнение кода прекращается.Ближайший блок try проверяется на наличие соответствующего обработчика catch. Если такой существует, управление передается ему.Иначе проверяется следующий из вложенных операторов try.Ниже приведен пример, в котором сначала создается объектисключение, затем оператор throw генерирует исключение, обрабатываемое в разделе catch, в котором генерируется другое исключение.// пример #3 : генерация исключений : ThrowGeneration.javapublic class ThrowGeneration {static void throwGen() {try {38throw new NullPointerException("демонстрация"); }catch (NullPointerException e) {System.out.println("исключение внутри метода throwGen()");throw e;}}public static void main(String[] args) {try { throwGen(); }catch(NulPointerException e) {System.out.println("генерация исключения вне метода: " + e);}}}Вызываемый метод throwGen() создает объект классаNullPointerException и генерирует исключение, перехватываемое обработчиком.
Код обработчика сообщает о том, что сгенерировано исключение, а затем снова генерирует его, в результате чего оно передается обработчику исключений в методе main().Если метод возбуждает исключение в с помощью оператора throwи блок catch отсутствует, то тип класса исключений должен быть указан в операторе throws при объявлении метода. Это означает, что обработка исключения возлагается на метод, вызвавший данный метод.// пример #4 : использование throws : ThrowsSample.javapublic class ThrowsSample {static void method() throws IllegalAccessException {System.out.println(" внутри метода ");throw new IllegalAccessException("демонстрация исключения");}public static void main(String[] args) {try {method();}catch (IllegalAccessException e) {System.out.println("перехвачено: " + e);}}}Ключевое слово finallyИногда нужно выполнить некоторые действия вне зависимости,произошло исключение или нет.