Основы объектно-ориентированного программирования 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основы объектно-ориентированного программирования



ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

 

для студентов специальности

«Экономика электронного бизнеса»

дистанционной формы обучения

 

Разработали:

Унучек Т.М.

Комличенко В.Н.

 

Минск-2014


 

Оглавление

Теоретический раздел.. 4

Тема 1. Введение в предмет и содержание дисциплины... 4

Особенности Java.. 5

Установка Java в переменных окружениях.. 5

Тема 2. Язык Java. Обзор базовых конструкций и основных элементов языка. Отличительные особенности Java (по сравнению с С++) Основные элементы и типы данных языка Java.. 7

Некоторые из особенностей элементов Java.. 7

Символы, строки и идентификаторы.. 7

Комментарии.. 7

Ключевые слова.. 8

Литералы.. 8

Разделители.. 8

Операции.. 9

Основные приложения Java.. 9

Метод update() 10

Требование перерисовки.. 10

Тема 3. Введение в классы java. Методы и классы. Классы и наследование в java. Пакеты и интерфейсы... 11

Введение в классы Java.. 11

Синтаксис определения экземпляра класса.. 11

Модификаторы класса.. 11

Конструкторы.. 12

Ограничение доступа к элементам класса.. 13

Статические переменные и методы.. 13

Абстрактные методы.. 14

Методы final. 15

Область видимости переменных.. 16

Переменные this и super. 16

Тема 4. Основы ввода/вывода. Работа со строковыми данными.. 18

Работа со строками.. 18

Потоки ввода-вывода информации.. 19

Байтовые и символьные потоки.. 19

Классы байтовых потоков. 20

Классы символьных потоков. 20

Предопределённые потоки.. 21

Тема 5. РАБОТА С ФАЙЛАМИ.. 21

Классы FileInputStream и FileOutputStream.. 22

BufferedInputStream и BufferedOutputStream.. 24

DataInputStream и DataOutputStream.. 26

Класс File. 27

Класс RandomAccessFile. 30

Тема 6. Методы и средства обработки исключений.. 33

Методы и средства обработки исключений.. 33

Тема 7. РАЗРАБОТКА АППЛЕТОВ, РАБОТА С ГРАФИКОЙ.. 34

Пакет AWT. 34

Класс Applet. 35

Инициализация и завершение апплета. 36

Запуск апплетов. 36

Рисование линий в апплете. 37

Рисование прямоугольников в апплете. 37

Рисование эллипсов и кругов в апплете. 38

Рисование дуг в апплете. 38

Работа с цветом.. 39

Тема 8. Многопоточное программирование.. 43

Интерфейсы в Java.. 43

Многопоточное программирование. 44

Организация потоков. 45

Создание нового потока.. 45

Тема 9. РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА С ИСПОЛЬЗОВАНИЕМ ФРЕЙМОВ, ЭЛЕМЕНТОВ УПРАВЛЕНИЯ.. 47

События. 47

Классы событий.. 48

Класс ActionEvent. 49

FocusEvent. 49

ItemEvent. 49

KeyEvent. 50

MouseEvent. 50

TextEvent. 51

WindowEvent. 51

Элементы-источники событий.. 51

Интерфейсы прослушивания событий.. 52

Классы пакета AWT: Component, Window, Frame. 53

Элементы управления Label, Button, Checkbox, Choice, List, Scrollbar. 55

Элементы управления TextField и TextArea. 59

Диалоговые окна. 62

Контроль знаний.. 66

Индивидуальная практическая работа № 1. «Объекты и классы». 66

Индивидульная практическая работа № 2. «Наследование и скрытие данных. Абстрактные классы и интерфейсы» 67

Контрольная работа № 1. «Работа с файлами». 68

Контрольная работа № 2. «Разработка пользовательского интерфейса с использованием фреймов, элементов управления». 70

Список использованных источников.. 73

 


 

Теоретический раздел

 

 

Лекция 1

Тема 1. Введение в предмет и содержание дисциплины

Существует 2 мнения относительно Java:

1) Java – производный от С++;

2) Java – самостоятельный язык программирования;

Обе версии имеют право на существование. Java – это простой объектно-ориентированный язык.

Java – объектно-ориентированная платформно-независимая многопоточная среда программирования.

Первая версия Java была задумана Дж. Гослингом, П. Ноутоном, К. Вартом, Э. Франком, М. Шериданом. Спецификация бала разработана компанией Sun Microsystems, выпущена в 1991 году. Сначала язык назывался “Oak” и был задуман как независимый от платформы язык с целью внедрения в электронные устройства различных производителей. Позднее появилась другая его особенность – пригодность для использования в WWW. Непосредственно Java его стали называть в 1995 году.

На Java можно создавать 4 основных вида приложений, которые можно разделить на две большие группы:

1) апплеты – это миниприложения, выполняемые в среде Java при помощи браузера (Netscape, Explorer, HotJava и др.)

< HTML >

< APPLET > < / APPLET >

</ HTML >

Апплет, как правило, размещается на сервере и загружается на клиента браузером при прочтении тега < APPLET >.

2) приложения – приложения командной строки, GUI-приложения и пакеты.

а)Приложения командной строки – обычные приложения, запускаемые с командной строки MS DOS. Для его выполнения необходима специальная утилита-интерпретатор или так называемая виртуальная машина Java, которая поставляется вместе с пакетом JDK (Java Development Kit).

б)GUI-приложения (Graphical User Interface) – это обычные программы под Windows, которые не требуют для работы присутствия браузера, их выполнение обеспечивается JVM (виртуальная машина Java).

в)Пакеты – похожи на библиотеку классов в С++. Это не приложения в чистом виде, а наборы классов, которые содержатся в одном пакете. Как правило, все классы пакета помещаются в один каталог, напр. пакеты AWT (Abstract Windows Toolkit – оконный пользовательский интерфейс).

 

 

Особенности Java

1) Java – это интерпретируемый язык. Сначала программист компилирует исходный текст утилитой javac. В командной строке записывается: javac имя_файла. java. Создаётся файл: имя_файла.class.

Байт-код является двоичным и не зависит от архитектуры компьютера. Это не законченное приложение. Оно не выполняется в операционной среде выполнения программы, а выполняется в runtime environment (браузере или JVM). Сначала создаётся промежуточный байт-код, затем он интерпретируется под конкретную систему. Так как байт-коды Java интерпретируются, web-страницы, имеющие апплеты, зачастую загружаются дольше. Это объясняется тем, что байт-коды апплетов или автономных приложений размещаются в отдельных файлах и содержат больше данных, необходимых для компиляции, чем обычно требуется в неинтерпретируемых программах.

2) Java – это объектно-ориентированный язык. Он относится к группе языков, рассматривающих данные как объекты и методы. Это язык со строгой типизацией. В Java отсутствуют указатели и множественное наследование.

3) Виртуальная Java-машина

Рис 1.1. Виртуальная Java-машина

 

JVM располагается только в оперативной памяти. Позволяет выполнять Java-приложения на множестве платформ, а не только в той системе, в которой скомпилирован код.

4) Клиент-серверные возможности языка Java. Язык Java разработан для распределенной среды, предоставляет специальные классы и широкие возможности организации работы в сети. Он поддерживает протоколы TCP/IP и, фактически, снижает сложность доступа к сетевому ресурсу до уровня сложности доступа к файлу, а также обеспечивает ряд технологий для разработки сетевых приложений. Кроме того, Java позволяет создавать интерактивные сетевые программы за счет поддержки многопоточного программирования и эффективных решений распараллеливания и синхронизации процессов. TCP/IP – это протокол взаимодействия между клиентом и сервером с установлением логического соединения.

 

Комментарии

1. /* текст */ - комментарии такого типа могут занимать несколько строк.

2. // …. – однострочные комментарии.

Комментарии не могут быть вложенными.

 

Ключевые слова

Ключевые слова нельзя использовать как идентификаторы: abstract, default, if, private, throw, boolean.

 

Литералы

Литерал – это представление в исходном коде значения простого типа.

Типы литералов:

1) Целый литерал – может быть выражен 10-чным, 16-чным или 8-чным числом. 10-чная запись числа является либо простым ASCII-символом “0”, либо состоит из цифр от 1 до 9. 16-чная запись числа состоит из ASCII-символов Ох или ОХ, идущих перед одной или несколькими ASCII 16-чными цифрами. 16-чные цифры со значениями от 10 до 15 обозначаются буквами от A до F. 8-чная запись числа состоит из ASCII-цифры “0”, сопровождаемой одной или большим количеством ASCII-цифр от 0 до 7.

Примеры целых литералов: 0, 2, 0372, ОхDataCafe, 1996, Ox00FF00FF

2) Вещественный литерал имеет следующие части – целая часть, десятичная точка, дробная часть, экспонента и суффикс типа. Экспонента обозначается ASCII-буквой е или Е, сопровождаемой целым числом (возможно со знаком). По крайней мере, одна цифра в целой или дробной части и либо десятичная точка, либо экспонента, либо плавающий суффикс типа необходимы. Все другие части необязательны.

Пример:

 

тип float 2.f.3f 0f 3.14f

тип double 2..3 0.0 3.14 1e-9d

 

3) Логический литерал. Это тип Boolean (true и false)

4) Символьный литерал. Представляется в виде символа или UNICODЕ-последовательности, заключённой в одиночные кавычки.

Пример:

‘a’ ‘%’ ‘\t’ ‘\\’ ‘\177’ ‘ ‘

5) Строковый литерал. Состоит из “0” или большего количества символов, которые заключены в “ ”. Каждый символ может быть представлен в UNICODЕ-последовательности. Строковый литерал имеет тип String и всегда ссылается на экземпляр класса String.

Пример:

“Я самый лучший”

6) Null-литералы. Тип Null имеет одно значение – нулевая ссылка, представляемая пустым литеральным указателем. Нулевой литерал всегда имеет тип Null.

 

Разделители

В Java 9 разделителей: () { } [ ];,.

Операции

=! && ++ -

> <= = = - - *

< >=!= + /

 

Основные приложения Java

Апплеты – это небольшие программы, размещаемые, как правило, на сервере, вызовы которых встраиваются в html-страницу и пересылаются на машину клиента, где выполняются при поддержке браузера.

Для внедрения апплетов Java в среду браузера создается html -тег. Обычно html-документ, вызывающий апплет, и сам апплет располагаются на одном и том же сервере.

Методы, применяемые для работы с апплетами: init(), start(), paint(Graphics g), stop(), destroy().

init() – отвечает за инициализацию апплета (подобно конструктору), всегда вызывается первым;

start() – отвечает за начало работы апплета, вызывается после init(), может вызываться много раз;

paint(Graphics g) – отвечает за прорисовку апплета, в качестве объекта принимает объект Graphics;

stop() – отвечает за приостановку работы апплета, может вызываться много раз;

destroy() – отвечает за уничтожение апплета (подобно деструктору).

 

Пример апплета, иллюстрирующий жизненный цикл его существования:

 

import java.applet.Applet;

import java.awt.*; /*содержит классы для работы с графикой, переписываем

все классы, входящие в пакет*/

import java.io.*; /*переписываем классы для ввода-вывода*/

public class LifeCycle extends Applet

{

public LifeCycle()

{ System.out.println("Запущен конструктор");

}

public void init()

{ System.out.println("Работает метод init");

}

public void start()

{ System.out.println("Апплет запущен");

}

public void paint(Graphics g)

{ g.drawString("Hello, Word",0,50);

}

public void stop()

{ System.out.println("Апплет остановлен");

}

public void destroy()

{ System.out.println("Апплет уничтожен.\n");

}

}

Чтобы выполнить написанный апплет, необходимо сохранить его в файле LifeCycle с расширением java. Затем с помощью утилиты javac откомпилировать LifeCycle. java. Компилятор создаст файл LifeCycle.class.

Апплет нельзя запустить из командной строки, нужен html-тег:

 

<HTML>

<TITLE> Жизненный цикл апплета </TITLE>

<APPLET CODE="LifeCycle.class" WIDTH=200 HEIGHT=200>

</APPLET>

</HTML>

 

Лекция 3

Метод update()

Этот метод используется в тех случаях, когда требуется перерисовать часть окна апплета. Заданная по умолчанию версия update() сначала заполняет апплет заданным по умолчанию цветом фона, а затем вызывает paint(). Если вы заполняете фон, используя другой цвет в paint(), то пользователь будет видеть вспышку заданного по умолчанию фона, когда вызывает update(), то есть всякий раз, когда окно перерисовывается.

Один из способов обойти эту проблему заключается в переопределении метода update() так, чтобы он исполнял все необходимые действия дисплея. Тогда, вызывая paint(), просто запускают update().

Пример:

 

public void update(Graphics g)

{ //здесь повторный показ нашего окна

}

public void paint(Graphics g)

{ update(g);

}

 

Требование перерисовки

Существует общее правило: апплет организует вывод в своё окно только тогда, когда вызываются методы update() или paint(). Как апплет модифицирует своё окно, когда информация изменяется?

Существует правило: апплет должен быстро возвратить управление в исполняющую систему. Он не может вызвать цикл внутри paint(). Для этого нужно вызвать метод repaint(), который необходим для обновления информации внутри апплета:

 

repaint()

{ paint(Graphics g)}

 


 

Введение в классы Java

Класс – это базовая конструкция Java. Класс – это шаблон для объекта. Объект – это экземпляр класса. Данные класса называются переменными экземпляра, так как каждый объект содержит собственную копию этих переменных. Код класса – это методы.

 

модификаторы class имя_созд._класса extends имя_супер_класса implements имя_интерфейса1, …, имя_интерфейсаN

{тело класса}

 

Пример класса, который читает строку с клавиатуры и выводит её на экран:

 

import java.io.*;

class HelloWorld {

public static void main(String args[])

{String s;

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

s=in.readLine();

System.out.println(“s= “+s);

}

}

 

Синтаксис определения экземпляра класса

имя_класса имя_переменной_экземпляра_класса;

BufferedReader in;

имя_переменной_экземпляра_класса = new имя_класса(параметры инициализации);

 

Модификаторы класса

Выделяют следующие модификаторы класса.

рublic – класс доступен для использования или расширения всем объектам вне зависимости от пакета или от каталога. Рublic-классы должны хранится в файлах с именем имя_класса.java. Для остальных классов такое соответствие рекомендуемое.

friendly – модификатор класса по умолчанию, если модификатор не определен явно для класса. Такой класс доступен только для объектов, находящихся в том же пакете. Вне пакета он выступает как private.

final – класс не может иметь подклассов, то есть производных классов. Обычно такие классы разрабатываются и используются для организации определённого стандарта реализации.

abstract – класс, в котором объявлен хотя бы один абстрактный метод. Для таких классов нельзя создавать объекты. Такие классы используются для производных классов, также для организации стандартизированных интерфейсов.

Пример:

 

abstract class Myclass {

abstract void actMet();

}

 

Множественное наследование в Java отсутствует. При расширении классов мы создаем класс, который является копией родительского класса, но с возможностью его расширять. По умолчанию создаваемый класс порождается от класса Object. При создании экземпляра класса или объекта необходимо сообщить компилятору имя переменной, используемой для обозначения экземпляра объекта, и выделить для него память при помощи операции new:

 

String s = new String(“abc”);

 

Конструкторы

Конструктор – это тот же метод класса, обладающий некоторыми особенностями:

· имеет такое же название, как и класс;

· вызывается сам;

· не возвращает никакого значения;

Пример для перегрузки конструктора;

 

class worker

{ private int Age;

public String Name;

public worker(); // конструктор без параметров

{ Age = 20;}

public worker(int newAge, String newName)

{ Age = newAge;

Name = newName;

}

public int getAge()

{return Age;}

};

public class worker_pub

{ public static void main(String args[])

{ worker wrk1 = new worker();

worker wrk2 = new worker(40, “Petrov”);

System.out.println(wrk1. getAge()+wrk1.Name);

System.out.println(wrk2. getAge()+wrk2.Name);

}

}

Результат на экране:

null

Petrov

 

Если мы не определяем явно конструктор, то Java создает его сам, без параметров.

 

Абстрактные методы

Объявляются при помощи ключевого слова abstract:

 

abstract void my_f1();

 

Абстрактный метод не имеет тела, нельзя даже ставить { }. Эти методы удобно использовать, если необходимо, чтобы метод присутствовал во всех классах потомках, но во всех классах имел разную реализацию.

 

Рис. 3.1. Абстрактный метод и его реализация

 

Метод “зарплата” абстрактный. При создании производных классов этот метод переопределяется так, как нужно в каждом из них.

Пример:

 

abstract class worker

{ protected int Age;

public String Name;

abstract public void setSalary(int newSalary);

}

class boss extends worker

{ public void setSalary(int newSalary)

{ if (newSalary >=0)

Salary = newSalary;

else Salary = 3000;

}

}

 

В классе-потомке абстрактный метод имеет свою реализацию. Если мы объявили какой-то метод класса абстрактным, то и весь класс нужно объявить абстрактным. В абстрактных классах нельзя создавать экземпляры абстрактного класса, но можно объявить объектную ссылку: worker w.

Экземпляр:

 

worker w = new worker(); //нельзя создавать

 

Абстрактный класс может содержать и неабстрактные методы.

 

Методы final

Эти методы объявляются как окончательные, не подлежащие дальнейшему переопределению при наследовании.

 

final void my_fun()

{…}

 

Ключевое слово final нельзя использовать для абстрактных методов.

Параметры, принимаемые методом final, могут передаваться как по значению (для базовых простых предопределённых типов данных), так и по ссылке (если в качестве параметра указывается объект).

 

Переменные this и super

Если необходимо обратиться к элементам собственного класса, то используется переменная this. Доступ к super-классу или родительскому классу осуществляется при помощи переменной super (если как переменная, то без (); если как конструктор, то super();).

Использовать такую переменную удобно, если в производном классе используется переопределённый метод, в котором используется код исходного метода. Часто переменная super используется для вызова конструктора базового класса в конструкторе производного класса.

Пример:

 

class my_class2 extends my_class1

{ ………….

public static void f1(int x, int y)

{ …………..

super.f1(x,y);

………… }

public my_class2(String str)

{ super(str1);

……….}

}

 

super и this неприменимы в классе с модификатором static.

Пример:

 

class MyClass

{ String s;

int i;

void f1(char c)

{ this.i=3; } //можно i=3

}

 

this используется в методах при обращении к элементам этого же класса.

 

 


 

Работа со строками

Для работы со строками определен класс String. Он определен в стандартной библиотеке Java в пакете java.lang (этот пакет импортируется по умолчанию).

Конструкторы:

 

public String(); //создает пустую строку

public String(char value[ ]); //создает строку из массива символов

public String(byte bytes[ ]); //создает строку из массива байтов

 

Пример:

 

String str = new String(“ Какая-то строка”);

можно также записать

String str = “Какая-то строка”;

 

Для строк определена операция сложения, которая означает конкатенацию строк. Определена операция сложения с числом: сначала число преобразуется в строку, а потом соединяются строка с числом. Определена операция сложения строки с любым объектом. Для объекта вызывается метод toString(), затем вызывается конкатенация строк.

Пример:

 

System.out.println(“Ошибка “+e.toString);

 

Методы для работы со строками:

 

public int compareTo(String anotherString); //этот метод сравнивает 2 строки

public int indexOf(int ch); //ищет индекс в строке

public int indexOf(String str); //ищет указанную строку в строке

public int length(); //возвращает длину строки

public String subString(int beginIndex, int endIndex); //выделяет подстроку из

// строки

public String trim(); //удаляет из строки начальный и конечный пробелы

public char charAt(int index); //выбирает из строки символ с индексом index

public boolean equals(Object str); //проверяет равенство строк

 

Лекция 5

Пример: ……….

 

public static void main(String args[])

{ String strOb1 = “Первая строка”;

String strOb2 = “Вторая строка”;

char c;

c = strOb1.charAt(3);

System.out.println(c);

if(strOb1. equals(strOb2)

System.out.println(“Равны”);

else System.out.println(“Не равны”);

if(args.lenght()<0)

System.out.println(“Введите параметр”);

}

 

Классы байтовых потоков

Байтовые потоки определяются в двух иерархиях классов. На верху этой иерархии два абстрактных класса: InputStream и OutputStream. Каждый из этих абстрактных классов имеет несколько конкретных подклассов, которые обрабатывают различия между разными устройствами: дисковые файлы, сетевые соединения, буферы памяти.

Абстрактные классы InputStream и OutputStream определяют несколько ключевых методов, которые реализуются другими поточными классами. Методы read(), write() переопределяются в производных классах.

 

Таблица 4.1

Классы байтовых потоков

Имя поточного класса Назначение
InputStream OutputStream Абстрактные классы, которые описывают поточный ввод и вывод
BufferedInputStream BufferedOutputStream Буферизированные потоки ввода и вывода
DataInputStream     DataOutputStream Поток ввода, который содержит методы для чтения данных стандартных типов Java; Поток вывода, который содержит методы для записи данных стандартных типов Java
FileInputStream   FileOutputStream Поток ввода, который читает из файла; Поток вывода, который записывает в файл
RandomAccessFile Поддерживает ввод-вывод файла произвольного доступа
PrintStream Поток вывода, который поддерживает методы print() и println()

 

Классы символьных потоков

Определены в двух иерархиях классов: Reader и Writer. Они обрабатывают потоки символов Unicode. Абстрактные классы Reader и Writer определяют методы read(), write(), которые реализуются другими поточными классами.

 

Таблица 4.2

Классы символьных потоков

Имя поточного класса Назначение
Reader Writer Абстрактные классы символьного потока ввода и вывода
BufferedReader BufferedWriter Буферизированные символьные потоки ввода и вывода
FileReader   FileWriter Поток ввода, который читает поток символов из файла; Выходной поток, который записывает символы в файл
StringReader   StringWriter Поток ввода, который читает из строки; Поток вывода, который записывает в строку
PrintWriter Поток вывода, который поддерживает методы print() и println()

 

Предопределённые потоки

Все программы Java автоматически импортируют пакет java.lang. Этот пакет определяет класс с именем System, который инкапсулирует некоторые аспекты исполнительной среды Java. Класс System содержит 3 предопределённые поточные переменные: in, out, err, объявленные со спецификатором public и static. Public означает, что они могут использоваться любой другой частью программы; static означает, что они могут использоваться без ссылки на конкретный объект.

Объект System.out называется потоком стандартного вывода. С ним связана консоль. Объект System.in называется потоком стандартного ввода. С ним связана клавиатура. Объект System.err называется стандартным потоком ошибок, который связан с консолью. Эти потоки могут быть переназначены на любое совместимое устройство ввода-вывода.

System.in – это объект типа InputStream; System.out, System.err – объекты типа PrintStream. Все они – байтовые потоки, хотя они обычно используются, чтобы читать и записывать символы с консоли и на консоль. Однако их можно упаковывать в символьные потоки.

Предпочтительный способ для чтения консольного ввода в Java2 заключается в использовании символьного потока. Консольной ввод выполняется с помощью считывания из объекта System.in. Чтобы получить символьный поток, который присоединен к консоли, нужно перенести (упаковать) System.in в объект типа BufferedReader (буферизированный входной поток). Обычно используется следующий его конструктор:

 

BufferedReader (Reader inputReader);

 

inputReader – поток, который связан с создающимся экземпляром класса BufferedReader;

Reader – это абстрактный класс. Один из его конкретных подклассов - InputStreamReader, который преобразовывает байты в символы.

Чтобы получить объект InputStreamReader, который связан с System.in, используется следующий конструктор:

 

InputStreamReader (InputStream inputStream);

 

Так как System.in ссылается на объект типа InputStream, его можно использовать в качестве параметра inputStream.

 

Тема 5. РАБОТА С ФАЙЛАМИ

 

 

Класс File

Если классы потоков осуществляют реальную запись и чтение данных, то класс File – это вспомогательный инструмент, призванный обеспечить работу с файлами и каталогами.

Объект класса File является абстрактным представлением файла и пути к нему. Он устанавливает только соответствие с ним, при этом для создания объекта неважно, существует ли такой файл на диске. После создания можно выполнить проверку, вызвав метод exists, который возвращает значение true, если файл существует. Создание или удаление объекта класса File никоим образом не отображается на реальных файлах. Для работы с содержимым файла можно получить экземпляры FileI/OStream.

Объект File может указывать на каталог (узнать это можно путем вызова метода isDirectory()). Метод list возвращает список имен (массив String) содержащихся в нем файлов (если объект File не указывает на каталог, будет возвращен null).

Следующий пример демонстрирует использование объектов класса File.

 

Пример 2.5

import java.io.*; public class FileDemo { public static void findFiles(File file, FileFilter filter, PrintStream output) throws IOException{ if (file.isDirectory()) { File[] list = file.listFiles(); for (int i=list.length; --i>=0;) { findFiles(list[i], filter, output); } } else { if (filter.accept(file)) output.println("\t" + file.getCanonicalPath()); } } public static void main(String[] args) { class NameFilter implements FileFilter { private String mask; NameFilter(String mask) { this.mask = mask; } public boolean accept(File file){ return (file.getName().indexOf(mask)!=-1)?true:false; } } File pathFile = new File("."); String filterString = ".java"; try { FileFilter filter = new NameFilter(filterString); findFiles(pathFile, filter, System.out); } catch(Exception e) { e.printStackTrace(); } System.out.println("work finished"); } }

При выполнении этой программы на экран будут выведены названия (в каноническом виде) всех файлов с расширением .java, содержащихся в текущем каталоге и всех его подкаталогах.

Для определения того, что файл имеет расширение .java, использовался интерфейс FileFilter с реализацией в виде внутреннего класса NameFilter. Интерфейс FileFilter определяет только один метод accept, возвращающий значение, определяющее, попадает ли переданный файл в условия фильтрации. Помимо этого интерфейса, существует еще одна разновидность интерфейса фильтра – FilenameFilter, где метод accept определен несколько иначе: он принимает не объект файла к проверке, а объект File, указывающий на каталог, где находится файл для проверки, и строку его названия. Для проверки совпадения с учетом регулярных выражений нужно соответствующим образом реализовать метод accept. В конкретном приведенном примере можно было обойтись и без использования интерфейсов FileFilter или FilenameFilter. На практике их можно использовать для вызова методов list объектов File – в этих случаях будут возвращены файлы с учетом фильтра.

Также класс File предоставляет возможность получения некоторой информации о файле:

· методы canRead и canWrite – возвращается boolean- значение, можно ли будет приложению производить чтение и изменение содержимого из файла, соответственно;

· getName – возвращает строку – имя файла (или каталога);

· getParent, getParentName – возвращают каталог, где файл находится в виде строки названия и объекта File соответственно;

· getPath – возвращает путь к файлу (при этом в строку преобразуется абстрактный путь, на который указывает объект File);

· isAbsolutely – возвращает boolean значение, является ли абсолютным путь, которым указан файл. Определение, является ли путь абсолютным, зависит от системы, где запущена Java -машина. Так, для Windows абсолютный путь начинается с указания диска, либо символом '\'. Для Unix абсолютный путь начинается символом '/';

· isDirectory, isFile – возвращает boolean значение, указывает ли объект на каталог либо файл соответственно;

· isHidden – возвращает boolean значение, указывает ли объект на скрытый файл;

· lastModified – дата последнего изменения;

· length – длина файла в байтах.

Также можно изменить некоторые свойства файла – методы setReadOnly, setLastModified, назначение которых очевидно из названия. Если нужно создать файл на диске, это позволяют сделать методы createNewFile, mkDir, mkDirs. Соответственно createNewFile создает пустой файл (если таковой еще не существует), mkDir создает каталог, если для него все родительские уже существуют, а mkDirs создает каталог вместе со всеми необходимыми родительскими.

Файл можно и удалить – для этого предназначены методы delete и deleteOnExit. При вызове метода delete файл будет удален сразу же, а при вызове deleteOnExit по окончании работы Java -машины (только при корректном завершении работы) отменить запрос уже невозможно.

Таким образом, класс File дает возможность достаточно полного управления файловой системой.

 

Класс RandomAccessFile

Этот класс реализует сразу два интерфейса – DataInput и DataOutput – следовательно, может производить запись и чтение всех примитивных типов Java. Эти операции, как следует из названия, производятся с файлом. При этом их можно производить поочередно, произвольным образом перемещаясь по файлу с помощью вызова метода seek(long) (переводит на указанную позицию в файле). Узнать текущее положение указателя в файле можно вызовом метода getFilePointer.

При создании объекта этого класса конструктору в качестве параметров нужно передать два параметра: файл и режим работы. Файл, с которым будет проводиться работа, указывается либо с помощью String – название файла, либо объектом File, ему соответствующим. Режим работы (mode) – представляет собой строку либо «r» (только чтение), либо «rw» (чтение и запись). Попытка открыть несуществующий файл только на чтение приведет к исключению FileNotFoundException. При открытии на чтение и запись он будет незамедлительно создан (или же будет брошено исключение FileNotFoundException, если это невозможно осуществить).

После создания объекта RandomAccessFile можно воспользоваться методами интерфейсов DataInput и DataOutput для проведения с файлом операций считывания и записи. По окончании работы с файлом его следует закрыть, вызвав метод close.

В следующем примере создается объект типа String, инициализируется текстовой строкой, определяется количество гласных, пробелов и общее количество букв. Реализован также механизм записи информации в файл и ее считывания из файла.

 

Пример 2.6

import java.io.*;

public class Lab1

{

private String data;

private String filename;

private String choice;

private RandomAccessFile fio;

private BufferedReader in=

new BufferedReader(new InputStreamReader(System.in));

public void runConsol(){

while(true){

try{

System.out.println("\nEnter your choice:");

System.out.println("1.Read text from file");

System.out.println("2.Type text");

System.out.println("3.Exit");

//чтение выбора пользователя

choice=in.readLine();

if (choice.compareTo("1")==0){

System.out.println("Type your filename");

filename=in.readLine();

fio = new RandomAccessFile(new File(filename), "r");

data=fio.readLine();

fio.close();

System.out.println("\nFile Input:\n"+data);

int spaces=0, glas=0, lett=0;

char ch;

for(int i=0;i<data.length();i++)

{

ch=Character.toLowerCase(data.charAt(i));

if(Character.isWhitespace(ch))

spaces++; if((ch=='a')||(ch=='e')||(ch=='i')||(ch=='o')||(ch=='u')||(ch=='y'))

glas++;

lett++;

}

System.out.println("\nspaces - "+spaces+"\nvowels - "+glas+"\nletters - "+(lett-spaces));

}

else if (choice.compareTo("2")==0){

System.out.println("Type your text");

data=in.readLine();

System.out.println("Type your filename");

filename=in.readLine();

fio = new RandomAccessFile(new File(filename), "rw");

fio.writeBytes(data);

fio.close();

System.out.println("Your text was saved");

}

else if (choice.compareTo("3")==0){

return;

}

}

catch(FileNotFoundException e){

System.out.println("File not found");

}

catch(IOException e){

System.out.println("Error1");

}

catch(Exception e){

System.out.println("Error2");

}

}

}

}

 

Результат выполнения программы:

Enter your choice:

1.Read text from file

2.Type test

3.Exit

Выбрав 2-й вариант, введем строку и имя файла, где необходимо сохранить строку. После этого будет предложено снова осуществить выбор.

Теперь выберем 1-й вариант. Введем имя нашего файла. В результате выведется исходная строка и итоги ее анализа: количество пробелов, гласных и общее количество букв. И снова будет предложен выбор.

Теперь выберем 3-й вариант. После этого программа завершит свою работу.

 

 


 

Пакет AWT

AWTAbstract Window Toolkit – абстрактный оконный интерфейс. Основное назначение пакета AWT: поддержка окон апплета и создание обычных

GUI -приложений. Классы пакета AWT определяют интерфейсные окна и работу с визуальными компонентами окон и содержатся в пакете java.awt.

На рис. 1.1 представлен фрагмент иерархии классов AWT. Практически все классы пакета AWT являются потомками абстрактного класса Component.

 

Рис. 1.1. Фрагмент иерархии классов AWT

 

Рассмотрим особенности программирования апплетов. В последних лабораторных работах рассмотрим более подробно другие классы пакета AWT.

 

Класс Applet

Для работы с апплетами предназначен класс Applet, который определяет методы, представленные в табл. 1.1. Applet обеспечивает всю необходимую поддержку для выполнения апплетов, такую как запуск и остановка. Он также реализует методы, которые загружают и показывают изображения, и методы, которые загружают и проигрывают аудио-клипы.

Таблица 1.1

Методы, определенные в классе Applet

 

Метод 1 Описание
void destroy() Освобождает все ресурсы, занятые апплетом. Вызывается браузером непосредственно перед тем, как апплет завершается. Метод destroy() вызывается, когда среда решает, что апплет должен быть полностью удален из памяти. В этот момент следует освободить любые ре­сурсы, которые апплет может использовать.
String getParameter(String paramName) Возвращает параметр, указанный в paramName. Если указанный параметр не найден, возвращается null (пустой указатель)

 

Окончание табл. 1.1



Поделиться:


Последнее изменение этой страницы: 2017-02-09; просмотров: 131; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.6.77 (2.386 с.)