Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Интерфейс FileFilter

Сериализация объектов | Интерфейс Serializable | Классы ObjectOutputStream и ObjectInputStream | Промежуточные данные | Практическая работа | События и их реализация в JFC | Событийная модель в JFC | Слушатели событий | Класс JList библиотеки Swing | Внешний вид отображаемого списка |


Читайте также:
  1. A.1. Классификация интерфейсов
  2. A.1.3. Графический интерфейс
  3. A.1.3.1. Простой графический интерфейс.
  4. A.1.3.2. WIMP - интерфейс
  5. COM-интерфейс
  6. IBM интерфейс
  7. Внутренние и внешние интерфейсы

Среди методов класса File, рассмотренного нами на прошлом занятии есть метод

public File[] listFiles(FileFilter filter)

В отличие от одноименного метода, но без параметра, этот метод отбирает не все файлы данного каталога, а только те, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра (FileFilter) — это не класс, а интерфейс.

Обратимся к документации по интерфейсу FileFilter. Мы увидим, что данный интерфейс имеет всего один метод

public boolean accept(File pathname)

Этот метод должен возвращать true, если файл нам подходит, и false, если нет.

С таким приемом программирования мы еще не встречались. Разберем его подробнее.

Метод listFiles будет вызывать метод accept для каждого файла в каталоге, и те, для которых accept вернет true, будут включены в результирующий список. Остальные будут проигнорированы.

Для использования этих возможностей нам нужно построить класс, удовлетворяющий интерфейсу FileFilter, и определить в нем соответствующий метод accept.

В качестве примера использования FileFilter модифицируем программу DirClean (рассматривали на прошлом занятии). Сейчас программа принимает только один параметр — имя каталога и удаляет все файлы в этом каталоге.

Расширим возможности программы DirClean.

Программа должна принимать один или два параметра. Если параметр один, она должна работать так же, как и раньше. Если задан второй параметр, то он задает расширение удаляемых файлов, и тогда программа должна удалять только те файлы, которые имеют указанное расширение.

1. Нам нужно создать класс, удовлетворяющий интерфейсу FileFilter. Определим статический вложенный класс ExtFilter.

2. Определим в классе ExtFilter метод accept

public boolean accept(File pathname) {

String extension = getExtension(pathname);

return extension.equals(ext);

}

 

3. Здесь для получения расширения файла используется другой метод — getExtension, который нам тоже нужно реализовать.

private String getExtension(File pathname) {

String filename = pathname.getPath();

int i = filename.lastIndexOf('.');

if (i>0 && i<filename.length()-1) {

return filename.substring(i+1).toLowerCase();

}

return "";

}

 

В данном методе при помощи вызова getPath мы получаем полное имя файла в виде строки. Потом, используя метод lastIndexOf класса String мы определяем позицию последней точки в строке имени файла и вырезаем из строки подстроку от последней точки до конца строки.

4. Кроме метода getExtension в методе accept присутствует переменная ext. Эта переменная должна быть полем нашего класса. Этому полю будет присваиваться значение второго параметра вызова программы в конструкторе класса ExtFilter. Окончательный вид класса ExtFilter такой

static class ExtFilter implements FileFilter {

 

String ext;

 

ExtFilter(String ext) {

this.ext = ext;

}

 

public boolean accept(File pathname) {

String extension = getExtension(pathname);

return extension.equals(ext);

}

 

private String getExtension(File pathname) {

String filename = pathname.getPath();

int i = filename.lastIndexOf('.');

if (i>0 && i<filename.length()-1) {

return filename.substring(i+1).toLowerCase();

}

return "";

}

 

}

 

5. Теперь осталось реализовать использование класса ExtFilter в нашей программе. Для этого строку

File[] fList = dir.listFiles();

предназначенную для получения списка файлов каталога заменим на следующую

File[] fList = dir.listFiles(args.length < 2? null: new ExtFilter(args[1]));

Т.е. в метод listFiles будет передаваться либо null, если нет второго параметра, либо объект класса ExtFilter, если он есть.

Результирующая программа выглядит так

// DirClean.java: удаление всех файлов в указанном каталоге

 

import java.io.*;

 

public class DirClean {

 

public static void main(String args[]) {

//--- 1. Проверим параметры вызова программы

if (args.length == 0) {

System.out.println(" Формат вызова: java DirClean имя_каталога

[расширение]");

return;

}

//--- 2. Создадим объект File для данного каталога и проверим, что

// — он существует;

// — что это действительно каталог.

File dir = new File(args[0]);

if (!dir.isDirectory()) {

System.out.println("Каталог "+args[0]+" не существует или

"+

"не является каталогом");

return;

}

//--- 3. Получим массив всех файлов в данном подкаталоге

File[] fList = dir.listFiles(args.length < 2? null: new ExtFilter(args[1]));

int ftotal = fList.length;

if (ftotal == 0) { // нечего удалять

System.out.println("Каталог "+args[0]+" уже пуст");

return;

}

//--- 4. Запрос к пользователю на подтверждение операции удалени

System.out.println(" Подтвердите удаление "+ftotal+

" файлов в каталоге "+args[0]+" Y/N");

try {

byte r[] = new byte[1];

r[0] = (byte)System.in.read();

char resp = (new String(r)).charAt(0);

if (resp == 'y' || resp == 'Y') {

for (int i = 0; i < ftotal; i++)

fList[i].delete();

System.out.println(" Удалено " + ftotal + " файлов");

}

} catch (IOException ex) {

ex.printStackTrace();

}

}

 

static class ExtFilter implements FileFilter {

 

String ext;

 

ExtFilter(String ext) {

this.ext = ext;

}

 

public boolean accept(File pathname) {

String extension = getExtension(pathname);

return extension.equals(ext);

}

 

private String getExtension(File pathname) {

String filename = pathname.getPath();

int i = filename.lastIndexOf('.');

if (i>0 && i<filename.length()-1) {

return filename.substring(i+1).toLowerCase();

}

return "";

}

 

}

}

 

Оттранслируем и запустим данную программу.

На этом рассмотрение собственно библиотеки ввода/вывода Java мы закончим.


Дата добавления: 2015-08-18; просмотров: 109 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Specifications| Класс JFileChooser

mybiblioteka.su - 2015-2024 год. (0.012 сек.)