Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все типы исходных данных.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
867 Кб
Скачать
☆
  • качестве параметра. Заметим, что все объекты передаются по ссылке. Можно изменять содержимое того объекта, на который ссылается данная переменная.

    1. Скрытие переменных представителей

    В языке Java не допускается использование в одной или во вложенных областях видимости двух локальных переменных с одинаковыми именами. Однако, при этом не запрещается объявлять формальные параметры методов, чьи имена совпадают с именами переменных представителей. Давайте рассмотрим в качестве примера иную версию метода init, в которой формальным параметрам даны имена х и у, а для доступа к одноименным переменным текущего объекта используется ссылка this.

    class Point { int х, у;

    void init(int х, int у) { this.x = х;

    this.у = у }

    }

    class TwoPointsInit {

    public static void main(String args[]) { Point p1 = new Point();

    Point p2 = new Point(); p1.init(10,20); p2.init(42,99);

    System.out.println("x = " + p1.x + " у = " + pl.y); System.out.printlnC'x = " + p2.x + " у = " + p2.y);

    }

    }

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

    Инициализировать все переменные класса всякий раз , когда создается его очередной представитель – довольно утомительное дело даже в том случае, когда в классе имеются функции, подобные методу init . Для этого в Java предусмотрены специальные методы, называемые конструкторами. Конструктор – это метод класса, который инициализирует новый объект после его создания. Имя конструктора всегда совпадает с именем класса, в котором он расположен. У конструкторов нет типа возвращаемого результата – никакого, даже void. Заменим метод init из предыдущего примера конструктором.

    class Point { int х, у;

    Point(int х, int у) { this.x = х;

    this.у = у;

    }

    }

    class PointCreate {

    public static void main(String args[]) { Point p = new Point(10,20);

    System.out.println("x = " + p.x + " у = " + p.у);

    }

    }

    3.7. Совмещение методов

    Язык Java позволяет создавать несколько методов с одинаковыми именами, но с разными списками параметров. Такая техника называется совмещением методов (method overloading). В качестве примера приведена версия класса Point, в которой совмещение методов использовано для определения альтернативного конструктора, который инициализирует координаты х и у значениями по умолчанию (-1).

    class Point { int х, у;

    Point(int х, int у) { this.x = х;

    this.у = у;

    }

    Point() { х = -1; у = -1;

    }

    }

    class PointCreateAlt {

    public static void main(String args[]) { Point p = new Point();

    System.out.println("x = " + p.x + " у = " + p.y);

    }

    }

    В этом примере объект класса Point создается не при вызове первого конструктора, как это было раньше, а с помощью второго конструктора без параметров. Вот результат работы этой программы:

    х = -1 у = -1

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

    3.8. Ссылка this в конструкторах

    Очередной вариант класса Point показывает, как, используя this и со-вмещение методов, можно строить одни конструкторы на основе других.

    class Point { int х, у;

    Point(int х, int у) { this.x = х;

    this.у = у;

    }

    Point() { this(-1, -1);

    }

    }

    В этом примере второй конструктор для завершения инициализации объекта обращается к первому конструктору.

    Методы, использующие совмещение имен, не обязательно должны быть конструкторами. В следующем примере в класс Point добавлены два метода distance. Функция distance возвращает расстояние между двумя точками. Одному из совмещенных методов в качестве параметров передаются координаты точки х и у, другому же эта информация передается в виде параметра-объекта Point.

    class Point { int х, у;

    Point(int х, int у) { this.x = х;

    this. y = y;

    }

    double distance(int х, int у) { int dx = this.x - х;

    int dy = this.у - у;

    return Math.sqrt(dx*dx + dy*dy);

    }

    double distance(Point p) { return distance(p.x, p.y);

    }

    }

    class PointDist {

    public static void main(String args[]) {

    Point p1 = new Point(0, 0); Point p2 = new Point(30, 40);

    System.out.println("p1 = " + pi.x + ", " + p1.y); System.out.println("p2 = " + p2.x + ", " + p2.y); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(60, 80) = " + p1.distance(60, 80));

    }

    }

    Обратите внимание на то, как во второй форме метода distance для получения результата вызывается его первая форма. Ниже приведен результат работы этой программы:

    р1 = 0, 0 р2 = 30, 40

    р1.distance(p2) = 50.0 p1.distance(60, 80) = 100.0

    3.9. Наследование классов

    Вторым фундаментальным свойством объектно-ориентированного под-хода является наследование. Классы-потомки имеют возможность не только создавать свои собственные переменные и методы, но и наследовать переменные и методы классов-предков. Классы-потомки принято называть подклассами. Непосредственного предка данного класса называют его суперклассом. В очередном примере показано, как расширить класс Point таким образом, чтобы включить в него третью координату z.

    class Point3D extends Point { int z;

    Point3D(int x, int y, int z) { this.x = x;

    this.у = у; this.z = z;

    }

    Point3D() { this(-1,-1,-1);

    }

    }

    В этом примере ключевое слово extends используется для того, чтобы сообщить транслятору, о намерении создать подкласс класса Point. Как видите, в этом классе не понадобилось объявлять переменные х и у, поскольку Point3D унаследовал их от своего суперкласса Point.

    3.10. Ссылка super

    В примере с классом Point3D частично повторялся код, уже имевшийся в суперклассе. Вспомните, как во втором конструкторе мы использовали this для вызова первого конструктора того же класса. Аналогичным образом ключевое слово super позволяет обратиться непосредственно к конструктору суперкласса.

    class Point3D extends Point { int z;

    Point3D(int x, int у, int z) {

    super(x, y); // Здесь мы вызываем конструктор суперкласса this.z=z;

    public static void main(String args[]) { Point3D p = new Point3D(10, 20, 30);

    System.out.println( " x = " + p.x + " y = " + p.y + " z = " + p.z);

    }

    }

    Вот результат работы этой программы: x = 10 у = 20 z = 30

    3.11. Замещение методов

    Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса (пример PointDist.java). Проблема заключается в том, что в классе Point уже определена версия метода distance(int х, int у), которая возвращает обычное расстояние между точками на плоскости. Мы должны заместить (override) это определение метода новым, пригодным для случая трехмерного пространства. В следующем примере проиллюстрировано и совмещение (overloading), и замещение (overriding) метода distance.

    class Point { int х, у;

    Point(int х, int у) { this.x = х;

    this.у = у;

    }

    double distance(int х, int у) { int dx = this.x - х;

    int dy = this.у - у:

    return Math,sqrt(dx*dx + dy*dy);

    }

    double distance(Point p) { return distance(p.х, p.y);

    }

    }

    class Point3D extends Point {

    int z;

    Point3D(int х, int y, int z) {

    super(x, y);

    this.z = z;

    }

    double distance(int х, int y, int z) { int dx = this.x - х;

    int dy = this.y - y; int dz = this.z - z;

    return Math.sqrt(dx*dx + dy*dy + dz*dz);

    }

    double distance(Point3D other) {

    return distance(other.х, other.y, other.z);

    }

    double distance(int х, int y) {

    double dx = (this.x / z) - х;

    double dy = (this.у / z) - y;

    return Math.sqrt(dx*dx + dy*dy);

    }

    }

    class Point3DDist {

    public static void main(String args[]) { Point3D p1 = new Point3D(30, 40, 10);

    Point3D p2 = new Point3D(0, 0, 0);

    Point p = new Point(4, 6);

    System.out.println("p1 = " + p1.x + ", " + p1.y + ", " + p1.z);

    System.out.println("p2 = " + p2.x + ", " + p2.y + ", " + p2.z);

    System.out.println("p = " + p.x + ", " + p.y); System.out.println("p1.distance(p2) = " + p1.distance(p2)); System.out.println("p1.distance(4, 6) = " + p1.distance(4, 6)); System.out.println("p1.distance(p) = " + p1.distance(p));

    }

    }

    Ниже приводится результат работы этой программы:

    p1 = 30, 40, 10 р2 = 0, 0, 0 р = 4, 6

    p1.distance(p2) = 50.9902 p1.distance(4, 6) = 2.23607 p1.distance(p) = 2.23607

    Обратите внимание — мы получили ожидаемое расстояние между трехмерными точками и между парой двумерных точек. В примере используется механизм, который называется динамическим назначением методов (dynamic method dispatch).

    3.12. Динамическое назначение методов

    Давайте в качестве примера рассмотрим два класса, у которых имеют простое родство подкласс/суперкласс, причем единственный метод суперкласса замещен в подклассе.

    class A {

    void callme() {

    System.out.println("Вызван callme метод класса А");

    }

    class В extends A { void callme() {

    System.out.println("Вызван callme метод класса B");

    }

    }

    class Dispatch {

    public static void main(String args[]) { A a = new B();

    a.callme();

    }

    }

    Обратите внимание, внутри метода main мы объявили переменную «а» класса «А», а проинициализировали ее ссылкой на объект класса «В». В следующей строке мы вызвали метод callme. При этом транслятор проверил наличие метода callme у класса «А», а исполняющая система, увидев, что на самом деле в переменной хранится представитель класса «В», вызвала не метод класса «А», а callme класса «В». Ниже приведен результат работы этой программы:

    «Вызван callme метод класса B»

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

    3.13. Директива final

    Все методы и переменные объектов могут быть замещены по умолчанию. Если же вы хотите объявить, что подклассы не имеют права замещать какие-либо переменные и методы вашего класса, вам нужно объявить их как final.

    final int FILE_NEW = 1;

    По общепринятому соглашению при выборе имен переменных типа final

    – используются только символы верхнего регистра. Использование final-методов порой приводит к выигрышу в скорости выполнения кода – поскольку они не могут быть замещены, транслятору ничто не мешает заменять их вызовы встроенным (in-line) кодом (байт-код копируется непосредственно в код вызывающего метода).

    3.14. Метод Finalize

    В Java существует возможность объявлять методы с именем finalize. Исполняющая среда Java будет вызывать его каждый раз, когда сборщик мусора соберется уничтожить объект этого класса.

    3.15. Директива static

    Иногда требуется создать метод, который можно было бы использовать вне контекста какого-либо объекта его класса. Так же, как в случае main, все, что требуется для создания такого метода – указать при его объявлении модификатор типа static. Статические методы могут непосредственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок this и super. Переменные также могут иметь тип static, они подобны глобальным переменным, то есть, доступны из любого места кода. Внутри статических методов недопустимы ссылки на переменные представителей. Ниже приведен пример класса, у которого есть статические переменные, статический метод и статический блок инициализации.

    class Static { static int a = 3; static int b;

    static void method(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b);

    }

    static {

    System.out.println("Инициализирован статический блок"); b = a * 4;

    }

    public static void main(String args[]) { method(42);

    }

    }

    Ниже приведен результат запуска этой программы.

    Инициализирован статический блок

    Х = 42 А = 3 B = 12

    В следующем примере мы создали класс со статическим методом и несколькими статическими переменными. Второй класс может вызывать статический метод по имени и ссылаться на статические переменные непосредственно через имя класса.

    class StaticClass { static int a = 42; static int b = 99; static void callme() {

    System.out.println("a = " + a);

    }

    }

    class StaticByName {

    public static void main(String args[]) { StaticClass.callme(); System.out.println("b = " + StaticClass.b);

    }

    }

    А вот и результат запуска этой программы:

    а = 42 b = 99

    3.16. Директива abstract

    Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов от-сутствует. В таких случаях вы можете с помощью модификатора типа abstract объявить, что некоторые из методов обязательно должны быть замещены в подклассах. Любой класс, содержащий методы abstract , также должен быть объявлен, как abstract. Поскольку у таких классов отсутствует полная реализация, их представителей нельзя создавать с помощью оператора new. Кроме того, нельзя объявлять абстрактными конструкторы и статические методы. Любой подкласс абстрактного класса либо обязан предоставить реализацию всех абстрактных методов своего суперкласса, либо сам должен быть объявлен абстрактным.

    abstract class A { abstract void callme(); void metoo() {

    System.out.println("Метод metoo класса А");

    }

    }

    class B extends A { void callme() {

    System.out.println("Метод callme класса B");

    }

    }

    class Abstract {

    public static void main(String args[]) { A a = new B():

    a.callme():

    a.metoo():

    }

    }

    В нашем примере для вызова реализованного в подклассе класса А метода callme и реализованного в классе А метода metoo используется динамическое назначение методов, которое мы обсуждали раньше

    Метод callme класса B Метод metoo класса А

    4. Работа с файлами

    Библиотека классов языка программирования Java содержит многочисленные средства, предназначенные для работы с файлами. Приложения Java могут работать как с локальными, так и с удаленными файлами (через сеть Internet или Intranet).

    Обобщенное понятие источника ввода относится к различным способам получения информации: к чтению дискового файла, символов с клавиатуры, либо получению данных из сети. Аналогично, под обобщенным понятием вывода также могут пониматься дисковые файлы , сетевое соединение. Эти абстракции дают удобную возможность для работы с вводом-выводом (I/O), не требуя при этом, чтобы каждая часть вашего кода понимала разницу между, скажем, клавиатурой и сетью. В Java эта абстракция называется потоком (stream) и реализована в нескольких классах пакета java.io. Ввод инкапсулирован в классе InputStream, вывод – в OutputStream. В Java есть несколько специализаций этих абстрактных классов, учитывающих различия при работе с дисковыми файлами, сетевыми соединениями и даже с буферами в памяти.

    4.1. Классы Java для работы с потоками

    Приложение Java, может работать с потоками нескольких типов:

    • стандартные потоки ввода и вывода;

    • потоки, связанные с локальными файлами;

    • потоки, связанные с файлами в оперативной памяти;

    • потоки, связанные с удаленными файлами Рассмотрим кратко классы, связанные с потоками.

    1. Стандартные потоки

    Для работы со стандартными потоками в классе System имеется три статических объекта: System.in, System.out и System.err. По своему назначению эти потоки больше всего напоминают стандартные потоки ввода, вывода и вывода сообщений об ошибках операционной системы MS-DOS.

    Поток System.in связан с клавиатурой, поток System.out и System.err – с консолью приложения Java.

    4.3. Базовые классы для работы с файлами и потоками

    Рассмотрим иерархию классов, предназначенных для организации ввода и вывода (рис. 1).

    Рис. 1. Основные классы для работы с файлами и потоками

    4.3.1. Класс InputStream

    Класс InputStream является базовым для большого количества классов, на основе которых создаются потоки ввода. Именно производные классы применяются при создании программ, так как в них имеются намного более мощные методы, чем в классе InputStream. Эти методы позволяют работать с

    потоком ввода не на уровне отдельных байт, а на уровне объектов различных классов, например, класса String и других.

    4.3.2. Класс OutputStream

    Аналогично, класс OutputStream служит в качестве базового для различных классов, имеющих отношение к потокам вывода.

    1. Класс RandomAccesFile

    • помощью класса RandomAccesFile можно организовать работу с файлами в режиме прямого доступа, когда программа указывает смещение и размер блока данных, над которым выполняется операция ввода или вывода. Классы InputStream и OutputStream также можно использовать для обращения к файлам в режиме прямого доступа.

    1. Класс File

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

    4.3.5. Класс FileDescriptor

    C помощью класса FileDescriptor вы можете проверить идентификатор открытого файла.

    4.3.6. Класс StreamTokenizer

    Очень удобен класс StreamTokenizer. Он позволяет организовать выделение из входного потока данных элементов, отделенных друг от друга заданными разделителями, такими, например, как запятая, пробел, символы возврата каретки и перевода строки.

    4.4. InputStream

    InputStream – абстрактный класс, задающий используемую в Java модель входных потоков. Все методы этого класса при возникновении ошибки возбуждают исключение IOException. Ниже приведен краткий обзор методов класса InputStream.

    • read() возвращает представление очередного доступного символа во входном потоке в виде целого.

    • read(byte b[]) пытается прочесть максимум b.length байтов из входного потока в массив b. Возвращает количество байтов, в действительности прочитанных из потока.

    • read(byte b[], int off, int len) пытается прочесть максимум len байтов, расположив их в массиве b, начиная с элемента off. Возвращает количество реально прочитанных байтов.

    • skip(long n) пытается пропустить во входном потоке n байтов. Возвращает количество пропущенных байтов.

    • available() возвращает количество байтов, доступных для чтения в настоящий момент.

    • close() закрывает источник ввода. Последующие попытки чтения из этого потока приводят к возбуждению IOException.

    • mark(int readlimit) ставит метку в текущей позиции входного потока, которую можно будет использовать до тех пор, пока из потока не будет прочитано readlimit байтов.

    • reset() возвращает указатель потока на установленную ранее метку.

    • markSupported() возвращает true, если данный поток поддерживает операции mark/reset.

    4.5. OutputStream

    Как и InputStream, OutputStream – абстрактный класс. Он задает модель выходных потоков Java. Все методы этого класса имеют тип void и возбуждают исключение IOException в случае ошибки. Ниже приведен список методов этого класса:

    • write(int b) записывает один байт в выходной поток. Обратите внимание, что аргумент этого метода имеет тип int, что позволяет вызывать write, передавая ему выражение, при этом не нужно выполнять приведение его типа к byte.

    • write(byte b[]) записывает в выходной поток весь указанный массив байтов.

    • write(byte b[], int off, int len) записывает в поток часть массива – len байтов, начиная с элемента b[off].

    • flush() очищает любые выходные буферы, завершая операцию вывода.

    • close() закрывает выходной поток. Последующие попытки записи в этот поток будут возбуждать IOException.

    1. Файловые потоки

      1. FilelnputStream

    Класс FileInputStream используется для ввода данных из файлов. В приведенном ниже примере создается два объекта этого класса, использующие один и тот же дисковый файл.

    InputStream f0 = new FileInputStream("/autoexec.bat");

    File f = new File("/autoexec.bat"):

    InputStream f1 = new FileInputStream(f);

    Когда создается объект класса FileInputStream, он одновременно с этим открывается для чтения. FileInputStream замещает шесть методов абстрактного класса InputStream. Попытки применить к объекту этого класса методы mark и reset приводят к возбуждению исключения IOException. В приведенном ниже примере показано, как можно читать одиночные байты, массив байтов и поддиапазон массива байтов. В этом примере также показано, как методом available можно узнать, сколько еще осталось непрочитанных байтов, и как с помощью метода skip можно пропустить те байты, которые вы не хотите читать.

    import java.io.*; import java.util.*;

    class FileInputStreamS {

    public static void main(String args[]) throws Exception { int size;

    InputStream f1 = new FileInputStream("www.root.com/default.htm"); size = f1.available();

    System.out.println("Всего доступно байтов: " + size); System.out.println("Читаем первую 1/4 часть файла"); for (int i=0; i < size/4; i++) {

    System.out.print((char) f1.read());

    }

    System.out.println("Теперь доступно : " + f1.available()); System.out.println("Читаем следующую 1/8 часть "); byte b[] = new byte[size/8];

    if (f1.read(b) != b.length) { System.err.println("Ошибка");

    }

    String tmpstr = new String(b, 0, 0, b.length); System.out.println(tmpstr);

    System.out.println("Осталось доступным: " + f1.available()); System.out.println("Пропустить следующую 1/4 часть"); f1.skip(size/4);

    System.out.println( "Осталось доступными: " + f1.available()); System.out.println("Читаем 1/16 часть в конец массива");

    if (f1.read(b, b.length-size/16, size/16) != size/16) { System.err.println("Ошибка");

    }

    System.out.println("Осталось доступно: " + f1.available()); f1.close();

    }}

    1. FileOutputStream

      • класса FileOutputStream – два таких же конструктора, что и у FileInputStream. Однако, создавать объекты этого класса можно независимо от того, существует файл или нет. При создании нового объекта класс FileOutputStream перед тем, как открыть файл для вывода, сначала создает его.

    • очередном нашем примере символы, введенные с клавиатуры, считываются из потока System.in – по одному символу за вызов, до тех пор, пока не заполнится 12-байтовый буфер. После этого создаются три файла. В первый из них, file1.txt, записываются символы из буфера, но не все, а через один – нулевой, второй и так далее. Во второй, file2.txt, записывается весь ввод, попавший в буфер. И наконец в третий файл записывается половина буфера, расположенная в середине, а первая и последняя четверти буфера не выводятся.

    import java.io.*;

    class FileOutputStreamS {

    public static byte getlnput()[] throws Exception { byte buffer[] = new byte[12];

    for (int i=0; i<12; i++) {

    buffer[i] = (byte) System.in.read();

    }

    return buffer;

    }

    public static void main(String args[]) throws Exception { byte buf[] = getlnput();

    OutputStream f0 = new FileOutputStream("file1.txt"); OutputStream f1 = new FileOutputStream("file2.txt"); OutputStream f2 = new FileOutputStream("file3.txt"); for (int i=0; i < 12; i += 2) {

    f0.write(buf[i]);

    }

    f0.close();

    f1.write(buf);

    f1.close();

    f2.write(buf, 12/4, 12/2); f2.close();

    } }

    1. Работа с файлами и каталогами при помощи класса File

    • предыдущих разделах мы рассмотрели классы, предназначенные для чтения и записи потоков. Однако часто возникает необходимость выполнения и таких операций, как определение атрибутов файла, создание или удаление каталогов, удаление файлов, получение списка всех файлов в каталоге и так далее. Для выполнения всех этих операций в приложениях Java используется класс с именем File.

    1. Создание объекта класса File

    У вас есть три возможности создать объект класса File, вызвав для этого один из трех конструкторов:

    public File(String path);

    public File(File dir, String name); public File(String path, String name);

    Первый из этих конструкторов имеет единственный параметр - ссылку на строку пути к файлу или каталогу. С помощью второго конструктора вы можете указать отдельно каталог dir и имя файла, для которого создается объект в текущем каталоге. И, наконец, третий конструктор позволяет указать полный путь к каталогу и имя файла.

    Если первому из перечисленных конструкторов передать ссылку со значением null, возникнет исключение NullPointerException.

    Пользоваться конструкторам очень просто. Вот, например, как создать объект класса File для файла c:\autoexec.bat и каталога d:\winnt:

    f1 = new File("c:\\autoexec.bat");

    f2 = new File("d:\\winnt");

    4.7.2. Определение атрибутов файлов и каталогов

    После того как вы создали объект класса File, нетрудно определить атрибуты этого объекта, воспользовавшись соответствующими методами класса File.

    С помощью метода exists вы можете проверить существование файла или каталога, для которого был создан объект класса File. Этот метод можно применять перед созданием потока на базе класса FileOutputStream, если вам нужно избежать случайной перезаписи существующего файла. В этом случае перед созданием выходного потока класса FileOutputStream следует создать объект класса File, указав конструктору путь к файлу, а затем проверить существование файла методом exists().

    Методы canRead и canWrite позволяют проверить возможность чтения из файла и записи в файл, соответственно. Их полезно применять перед созданием соответствующих потоков, если нужно избежать возникновение исключений, связанных с попыткой выполнения доступа неразрешенного типа. Если доступ разрешен, эти методы возвращают значение true, а если запрещен – false.

        • помощью методов isDirectory и isFile вы можете проверить, чему соответствует созданный объект класса File – каталогу или файлу.

    Метод getName возвращает имя файла или каталога для заданного объекта класса File (имя выделяется из пути).

    Метод getAbsolutePath возвращает абсолютный путь к файлу или каталогу, который может быть машинно-зависимым.

        • помощью метода isAbsolute вы можете определить, соответствует ли данный объект класса File файлу или каталогу, заданному абсолютным (полным) путем, либо относительным путем.

    Метод getPath позволяет определить машинно-независимый путь файла или каталога.

    Если вам нужно определить родительский каталог для объекта класса File, то это можно сделать методом getParent.

    Длину файла в байтах можно определить с помощью метода length.

    Для определения времени последней модификации файла или каталога вы можете вызвать метод lastModified. Этот метод возвращает время в относительных единицах с момента запуска системы, поэтому его удобно использовать только для относительных сравнений.

    Метод toString возвращает текстовую строку, представляющую объект класса File.

    Метод hashCode возвращает значение хэш-кода, соответствующего объекту File.

    Для удаления ненужного файла или каталога вы должны создать соответствующий объект File и затем вызвать метод delete.

        • помощью методов mkdir и mkdirs можно создавать новые каталоги. Первый из этих методов создает один каталог, второй – все подкаталоги, ведущие к создаваемому каталогу (то есть полный путь).

    Для переименования файла или каталога вы должны создать два объекта класса File, один из которых соответствует старому имени, а второй – новому. Затем для первого из этих объектов нужно вызвать метод renameTo, указав ему

    • качестве параметра ссылку на второй объект.

    случае успеха метод возвращает значение true, при возникновении ошибки – false. Может также возникать исключение SecurityException.

    Для сравнения объектов класса File вы должны использовать метод equals. Этот метод сравнивает пути к файлам и каталогам, но не сами файлы или каталоги.

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

    FilenameFilter.

    Основные пакеты

    Пакет

    Функции

    java.applet

    Создание апплетов

    java.awt

    Работа с графикой и создание GUI

    java.awt.Color

    Создание объектов управляющих цветом

    java.beans

    Разработка компонентов JavaBeans

    java.io

    Ввод-вывод

    java.lang

    Основные функции языка

    java.math

    Выполнение математических операций

    java.net

    Работа с сетевыми подключениями

    java.rmi

    Удаленный вызов метода

    java.sql

    Работа с SQL

    java.text

    Форматирование текста

    java.util

    Основные утилиты

    java.util.jar

    Чтение и запись JAR

    java.util.regex

    Сопоставление последовательности с регулярным выражением

    java.util.zip

    Чтение и запись ZIP и Gzip

    javax.crypto

    Криптографические операции

    javax.swing

    Создание интерфейса на основе java.awt

    javax.xml.parsers

    Работа с XML