Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница54 из 90
1   ...   50   51   52   53   54   55   56   57   ...   90
import java.io.File;
class DirList {
public static void m a m (String args [
]
)
{
String dirname = "/java";
File fl = new File(dirname);
if (f1.isDirectory()) Каталог " + dirname);
String s[] = fl.listO;
for (int i=0; i < s.length; i++) {
File f = new File (dirname
"/" - s [i ]
)
;
if (f .isDirectory()) {
System.out.println(s [i 1
+ " является каталогом

6 0 0 Часть II. Библиотека Java
} else {
System.out.println(s[i] + " является файлом else {
System.out.println(dirname + " is not a Ниже приведен вывод этой программы. (Конечно, вывод, который вы увидите, может отличаться, — в зависимости оттого, что находится в каталоге.)
Каталог /java
bin является каталогом
lib является каталогом
demo является каталогом
COPYRIGHT является файлом
README является файлом
index.html является файлом
include является каталогом
src.zip является файлом
src является каталогом
Использование интерфейса
F i l e n a m e F i l t e Нередко необходимо ограничить количество файлов, возвращенных методом l i s t () , для включения только тех файлов, которые соответствуют определенному шаблону имен, или фильтру. Для этого следует использовать вторую форму метода
l i s t
().
String[] list(FilenameFilter В этой форме объект Р Р — это объект класса, реализующего интерфейс
F ile n a m e F ilt e r . Интерфейс F ile n a m e F ilt e r определяет единственный метод a c c e p t (), вызываемый по одному разу с каждым файлом в списке. Его общая форма такова accept(File каталог String

имяфайла)
Метод a c c e p t () возвращает значение t r u e для файлов каталога, указанного в каталог, которые должны быть включены в список (те. тех, что соответствуют аргументу имя файла, и значение f a l s e — для файлов, которые следует из списка исключить.
Класс O nlyExt, показанный ниже, реализует интерфейс F ile n a m e F ilt e r . Он будет использован для модификации предыдущей программы, чтобы ограничить видимость имен файлов, возвращенных методом l i s t (), только теми из них, которые оканчиваются расширением, указанным при создании этого объекта java.io.*;

public class OnlyExt implements FilenameFilter {
String ext;
public OnlyExt(String ext) {
this.ext =
+ ext;
}
public boolean accept(File dir, String name) {
return n a m e .endsWith(ext);
}
}
Глава 19. Ввод-вывод: пакет java.io
6 0 Модифицированная программа просмотра списка каталога показана ниже. Теперь она выведет только файлы с расширением . ht m l .
// Каталог файлов .HTML,
import java.io.*;
class DirListOnly {
public static void main(String a r g s []) {
String dirname = "/java";
File fl = new File(dirname);
FilenameFilter only = new OnlyExt("html");
String s [] = f1.list(only);
for (int i=0; i < s.length; i++) {
System.out.println(s [i Альтернатива — метод
l i s t F i l e s
( Существует вариация метода list ()
, именуемая listFilesO, которую вы можете счесть удобной. Сигнатуры метода listFiles
() показаны ниже i l e [ ]

listFiles(
)
File[ ]
listFiles (FilenameFilter
объек-TFF)
Filet ]
listFiles(FileFilter объект Эти методы возвращают список файлов в виде массива объектов класса
File вместо строк. Первый метод возвращает все файлы, второй — только те, что удовлетворяют указанному интерфейсом
FilenameFilter. Помимо возвращения массива объектов класса
File, эти две версии метода listFilesO работают точно также, как и методы list (Третья версия метода listFiles
() возвращает те файлы, путевые имена которых соответствуют указанному объектом интерфейса. Интерфейс
FileFilter определяет единственный метод accept ()
, который вызывается один раз для каждого файла в списке. Его общая форма такова,
boolean accept(File
путь)
Метод accept
() возвращает значение true для файлов, которые должны быть включены в список (те. тех, что соответствуют аргументу путь и значение false
— для тех, которые следует исключить.
Создание каталогов
Еще двумя полезными служебными методами класса
File являются) и mkdirs
( ) . Метод mkdir
() создает каталог, возвращая значение true в случае успеха и значение false
— в случае неудачи. Неудача может произойти по разным причинам , например путь, указанный в объекте класса
File, уже существует или каталог не может быть создан поп ричине того, что полный путь к нему еще не существует. Чтобы создать каталог, для которого путь еще не создан, используйте метод mkdirs ()
. Он создаст как сам каталог, таки всех его родителей
Интерфейсы
AutoCloseable, Closeable И Для потоковых классов весьма важны три интерфейса. Два из них — интерфейсы и
Flushable
— были определены в пакете java. io и добавлены в комплекте JDK 5. Третий интерфейс —
AutoCloseable
— был добавлен в комплекте JDK 7 и расположен в пакете j ava .
Интерфейс осуществляет в комплекте JDK 7 поддержку нового оператора try
-с-ресурсами, который автоматизирует процесс закрытия ресурса (см. главу 13). Только объекты классов, реализующих интерфейс
AutoCloseable, могут управляться оператором
try-с-ресурсами. Интерфейс обсуждается в главе 16, но здесь, для удобства, приведен его краткий обзор. Интерфейс определяет только метод close ().
void c l o s e () throws Этот метод закрывает вызывающий объект, высвобождая любые ресурсы, которые он может использовать. Метод вызывается автоматически в конце оператора try-с-ресурсами, избавляя таким образом от необходимости явно вызывать метод close ()
. Поскольку этот интерфейс реализуется всеми классами ввода-вывода, которые открывают поток, такие потоки могут быть автоматически закрыты оператором try-с-ресурсами. Автоматическое закрытие потоков гарантирует правильность их закрытия, когда они больше ненужны, предотвращая таким образом утечку памяти и другие проблемы.
И нтерфейс
Closeable также определяет метод close ()
. Объекты этого класса, реализующего интерфейс
Closeable, могут быть закрыты. Начиная с комплекта JDK 7 интерфейс
Closeable расширяет интерфейс
AutoCloseable. Поэтому в комплекте JDK 7 льббой класс, который реализует интерфейс
Closeable также, реализует интерфейс Объекты класса, реализующего интерфейс
Flushable, могут заставить буфе­
ризованный вывод записываться в поток, к которому присоединен данный объект. Он определяет метод flush ()
, показанный ниже flush() throws Сброс потока обычно вынуждает буферизованный вывод физически записываться на лежащем в основе устройстве. Этот интерфейс реализован всеми классами ввода-вывода, способными выполнять запись в поток.
Исключения ввода-вывода
Два исключения играют важную роль в обработке ввода-вывода. Первое из них — исключение
IOExcept ion
— имеет отношение к большинству классов ввода- вывода, описанных в данной главе, поэтому при ошибке ввода-вывода происходит передача исключения
IOException. В большинстве случаев, если файл не может быть открыт, передается исключение
FileNotFoundException. lOiacc исключения
FileNotFoundException происходит от класса
IOException, поэтому оба могут быть обработаны водном блоке catch, предназначенном для обработки исключения
IOException. Этот подход используется для краткости в большинстве примеров кода данной главы. Однако в собственных приложениях вам может иметь смысл обрабатывать их по отдельности.
Другой класс исключения, который иногда очень важен при выполнении ввода- вывода, — это класс
SecurityException. Как описано в главе 13, когда присут­
6 0 2 Часть II. Библиотека Java
Глава 19. Ввод-вывод: пакет java.io
6 0 3
ствует менеджер безопасности, некоторые классы файлов передают исключение
S e c u r i t y E x c e p t i o n при попытке открыть файл с нарушением безопасности. По умолчанию приложения, запущенные при помощи команды j a v a , не используют менеджер безопасности. Поэтому примеры ввода-вывода в этой книге не отслеживают возможность передачи исключения
S e c u r i t y E x c e p t i o n . Однако аплеты будут использовать менеджер безопасности, предоставленный браузером, и файловый ввод- вывод, выполняемый аплетом, может передать исключение
S e c u r i t y E x c e p t i o n . В таком случае вам придется обрабатывать и это исключение.
Два способа закрытия потока
Как правило, поток следует закрыть, когда он больше ненужен. Если не сделать этого, может произойти утечка памяти и потеря ресурсов. Методики закрытия потока были описаны в главе 13, но из-за важности кратко напомню их здесь, прежде чем перейти к рассмотрению потоковых классов.
Начиная с JDK 7 существует два основных способа, которыми вы можете закрыть поток. Первый подразумевает явный вызов метода c l o s e
() для потока. Это традиционный подход, который использовался начиная с первого выпуска Java. При этом подходе метод c l o s e
() обычно вызывается в блоке f i n a l l y . Таким образом, упрощенный шаблон традиционного подхода выглядит так {

// открыть и использовать файл c a t c h
{исключениеВвода-вывода)
{
/ / . .
} finally {
// закрыть файл
}
Эта общая методика (или его разновидность) популярна в коде, предшествующем JDK Второй подход закрытия потока подразумевает автоматизацию процесса с использованием нового оператора t r y - с
-р е сур сами который появился в комплекте JDK 7. Оператор- с - ресурсами это улучшенная форма оператора t r y , имеющего следующую форму (
спецификация-ресурса)
{
// использование ресурса
}
Здесь спецификация ресурса это оператор или операторы, которые объявляют и инициализируют ресурс, такой как файл или другой связанный с потоком ресурс. Он состоит из объявления переменной, в котором переменная ини­
циализируется ссылкой на управляемый объект. Когда заканчивается блок t r y , ресурс освобождается автоматически. В случае файла это означает, что он автоматически закрывается. Таким образом, нет никакой необходимости вызывать метод c l o s e
() явно.
Вот три ключевых пункта, касающихся оператора t r y -с ресурсами Ресурсы, управляемые оператором t r y - с
-р е сур сами должны быть объектами классов, реализующих интерфейс
A u t o C l o s e a b l e Ресурс, объявленный в блоке t r y , является неявно финальным.
• Вы можете управлять несколькими ресурсами, отделив каждый из них в объявлении точкой с запятой

6 0 Часть II. Библиотека Кроме того, не забывайте, что область видимости объявленного ресурса ограничивается оператором t r y с ресурсами Основное преимущество оператора t r y - с ресурсами заключается в том, что ресурс (в данном случае — поток) закрывается автоматически по завершении блока t r y . Таким образом, невозможно забыть закрыть поток, например. Кроме того, подход с оператором t r y - с - ресурсами дает обычно более краткий и понятный исходный код, который проще поддерживать.
Благодаря своим преимуществам, оператор t r y
- с - ресурсами как ожидается, будет интенсивно использоваться в новом коде. В результате большая часть кода этой главы (и книги) будет использовать его. Однако поскольку существуют миллионы строк кода, написанного до появления комплекта JDK 7, программисты должны быть знакомы с традиционным подходом закрытия потока. Например, вам, весьма вероятно, придется работать с устаревшим кодом, который применяет традиционный подходили в среде, которая использует версию Java, предшествующую комплекту JDK 7. Может сложиться ситуация, когда автоматизированный подход окажется неприменим из-за других аспектов вашего кода. Поэтому несколько примеров ввода-вывода в этой книге демонстрируют традиционный подходи вы сможете увидеть его в действии.
Еще один момент примеры, которые используют оператор t r y с ресурсами следует компилировать в комплекте JDK 7 или позже. Они не будут работать со старым компилятором. Примеры, которые используют традиционный подход, могут быть откомпилированы прежними версиями Помните Поскольку оператор
t r y -с ресурсами упрощает процесс освобождения ресурсов и устраняет возможность их случайного пропуска, этот подход рекомендуется для нового кода, когда его использование возможно.
Классы потоков
Основанный на потоках ввода-вывода, Java построен на базе абстрактных классов
I n p u t S t r e a m , O u t p u tS t r e a m , R e a d e r и
W r i t e r . Эти классы уже были кратко упомянуты в главе 13. Они используются для создания некоторых конкретных подклассов потоков.
Хотя ваши программы реализуют свои операции ввода-вывода через конкретные подклассы, классы верхнего уровня определяют базовые функциональные возможности, общие для всех потоковых классов.
Классы
I n p u t S t r e a m и
O u t p u t S t r e a m предназначены для байтовых потоков, а абстрактные классы
R e a d e r и
W r i t e r
— для символьных. Классы байтовых и символьных потоков формируют отдельные иерархии. В целом классы символьных потоков следует использовать, имея дело с символами строка классы байтовых потоков — работая с байтами или другими двоичными объектами.
Далее в этой главе мы будем рассматривать как байтовые, таки символьные потоки.
Байтовые потоки
Классы байтовых потоков предоставляют богатую среду для обработки байтового ввода-вывода. Байтовый поток может быть использован с объектами любого типа, включая двоичные данные. Такая многосторонность делает байтовые потоки
Глава 19. Ввод-вывод: пакет java.io
6 0 важными для многих типов программ. Поскольку классы байтовых потоков берут свое начало с классов
Input
St ream и
OutputStream, с них и начнем обсуждение.
Класс Класс
I при t
S t г е это абстрактный класс, определяющий модель байтового потокового ввода. Он реализует интерфейсы
AutoCloseable и
Closeable. При ошибках ввода-вывода большинство методов этого класса передает исключение
IOException. Сюда не входят методы mark
() и markSupported ().) В табл. 19.2 перечислены методы класса Таблица

1 9 . 2 . Методы, определенные в классе
i n p u t s t r e a m
Метод
Описание
int a v a i l a b l e ()
void c l o s e ()
void mark(int
колБайтов)
boolean m a r k S u p p o r t e d ()
int read()
int read(byte буфер буфер смещение кол Байтов
колБайтов)
Возвращает количество байтов ввода, которые доступны в данный момент для чтения
Закрывает источник ввода. Последующие попытки чтения передадут исключение IO E x cep tio Помещает метку в текущую точку входного потока, которая остается корректной до тех пор, пока небу дет прочитано кол Байтов байт
Возвращает значение t r u e , если методы mark () и r e s e t () поддерживаются вызывающим потоком
Возвращает целочисленное представление следующего доступного байта в потоке. При достижении конца файла возвращается значение -Пытается читать до кол Байтов в буфер, возвращая количество успешно прочитанных байтов. По достижении конца файла возвращает значение -Пытается читать до кол Байтов в буфер, начиная с буфер смещение и возвращая количество успешно прочитанных байтов. По достижении конца файла возвращает значение -Сбрасывает входной указатель в ранее установленную метку
Игнорирует (те. пропускает) кол Байтов байт ввода, возвращая количество действительности проигнорированных байтов
На заметку Большинство методов, описанных в табл. 19.1, реализуется производными классами класса
inputstream. Методы

mark
() и
reset
() — исключения обратите внимание на их использование или отсутствие такового в каждом производном классе и следующих обсуждениях.
Класс Класс
OutputStream
— это абстрактный класс, определяющий потоковый байтовый вывод. Реализует интерфейсы
AutoCloseable, Closeable и
Flushable. Большинство методов этого класса возвращает void и передает исключение
IOException в случае ошибок ввода-вывода. В табл. 19.3 перечислены методы класса
OutputStream.

6 0 6 Часть II. Библиотека На заметку Большинство методов, описанных в табл. 19.2 и 19.3, реализовано подклассами классов
I n p u t S t r e a m и
OutputStream. Методы
m a r k (
) и
reset (
) являются исключениями имейте это ввиду, когда ниже речь пойдет о каждом подклассе.

Таблица 19.3. Методы, определенные в классе
O u t p u t S t r e a m
Метод
Описание
int c l o s e (Закрывает выходной поток. Последующие попытки записи передадут исключение
IOException
void f l u s h ()
Финализирует выходное состояние, очищая все буферы, те. очищает буферы вывода write(int Записывает единственный байт в выходной поток. Обратите внимание на то, что параметр имеет типа это позволяет вызывать метод
write
() с выражениями без необходимости приведения их обратно к типу
byte
void write(byte буфер) Записывает полный массив байтов в выходной поток write(byte буфер, Записывает диапазон из кол Байтов байт из массива
колБайтов)
буфер начиная с буфер
[
смещение]
Класс
F i l e l n p u t s t r e a Класс
Filelnputstream создает объект класса
InputStream, который вы можете использовать для чтения байтов из файла. Так выглядят два его наиболее часто используемых конструктора

путьКфайлу)
Filelnputstream(File
объектФайла)
Каждый из них может передать исключение
FileNotFoundException. Здесь
путьКфайлу
полное путевое имя файла, а
объектФайла
— объект класса
File, описывающий файл. В следующем примере создается два объекта класса
Filelnputstream, использующих один и тот же дисковый файл и оба эти конструктора f0 = new Filelnputstream("/autoexec.b a t ")

1   ...   50   51   52   53   54   55   56   57   ...   90


написать администратору сайта