| |
определена, вызывается второй вариант этого же метода:
else
dirlist = fdir.list(new MaskFilter(sMask));
Здесь в качестве параметра методу list мы передаем вновь созданный объект
класса MaskFilter (фильтр), передав соответствующему конструктору строку маски.
В любом случае метод list заполняет полученным списком массив строк dirlist.
Содержимое этого массива перебирается в цикле:
for (int i = 0; i < dirlist.length; i++)
{
File f = new File(sDirPath + "\\" + dirlist[i]);
if(f.isFile())
System.out.println(dirlist[i].toLowerCase());
else
System.out.println(dirlist[i]);
}
Для каждого элемента массива мы создаем объект класса File, передавая
конструктору путь каталога, добавив к нему разделитель и строку элемента
массива. Затем если данная строка соответсвует файлу, а не каталогу, имя
выводится строчными буквами. Для преобразования мы вызываем метод toLowerCase,
определенный в классе String.
Рассмотрим теперь класс MaskFilter, предназначенный для фильтрации имен,
которые метод list возвращает вызвавшему его методу.
Класс MaskFilter определен следующим образом:
class MaskFilter implements FilenameFilter
{
. . .
}
Как видно из определения, этот класс реализует интерфейс FilenameFilter. В
рамках интерфейса FilenameFilter вам нужно переопределить метод accept, который
проверяет, подходит ли имя файла критерию отбора, заданному маской, и в
зависимости от этого возвращает либо значение true (если подходит), либо false
(если не подходит).
Маска передается конструктору класса MaskFilter, преобразуется им в
прописные буквы и сохраняется в поле sNameMask для использования в процессе
проверки методом accept:
MaskFilter(String sMask)
{
sNameMask = sMask.toUpperCase();
}
Что же касается метода accept, то он выглядит достаточно просто:
public boolean accept(File dir, String name)
{
if(sNameMask.equals("*"))
return true;
return (name.indexOf(sNameMask) != -1);
}
В качестве первого параметра этому методу передается путь к каталогу, а в
качестве второго - имя файла. Метод accept вызывается для каждого файла и
каталога, расположенного в каталоге dir.
Наша реализация этого метода вначале проверяет маску. Если маска задана как
строка “*”, подходит любое имя, поэтому метод accept всегда возвращает значение
true.
Если же используются другие маски, то наш метод выполняет ее поиск в строке
имени с помощью метода indexOf. Если строка маски найдена как подстрока имени
файла или каталога, такое имя нам подходит и метод accept возвращает значение
true. В противном случае возвращается значение false.
Произвольный доступ к файлам
В ряде случаев, например, при создании системы управления базой данных,
требуется обеспечить произвольный доступ к файлу. Рассмотренные нами ранее
потоки ввода и вывода пригодны лишь для последовательного доступа, так как в
соответствующих классах нет средств позиционирования внутри файла.
Между тем библиотека классов Java содержит класс RandomAccessFile, который
предназначен специально для организации прямого доступа к файлам как для чтения,
так и для записи.
В классе RandomAccessFile определено два конструктора, прототипы которых
показаны ниже:
public RandomAccessFile(String name, String mode);
public RandomAccessFile(File file, String mode);
Первый из них позволяет указывать имя файла, и режим mode, в котором
открывается файл. Второй конструктор вместо имени предполагает использование
объекта класса File.
Если файл открывается только для чтения, вы должны передать конструктору
текстовую строку режима "r". Если же файл открывается и для чтения, и для
записи, конструктору передается строка "rw".
Позиционирование внутри файла обеспечивается методом seek, в качестве
параметра pos которому передается абсолютное смещение файла:
public void seek(long pos);
После вызова этого метода текущая позиция в файле устанавливается в
соответствии со значением параметра pos.
В любой момент времени вы можете определить текущую позицию внутри файла,
вызвав метод getFilePointer:
public long getFilePointer();
Еще один мето
|
|