Предисловие
Начиная с этой статьи, мы начнем изучать систему Java IO, которая, по сути, чтение и написание файлов. Это звучит просто, но это не просто. Система Java IO улучшается и улучшается и разработала большое количество классов. Только понимание значения разработанных этих типов и их соответствующих сценариев применения мы можем улучшить понимание файла io.
Итак, первый шаг - решить проблему того, как представлять файл. В мире Java «все является объектом», и как соответствовать фактическому файлу диска или каталогу объекту Java, является нашей основной проблемой.
Файл используется в Java, чтобы абстрагировать файл, будь то обычный файл или каталог, он может соответствовать объекту файла. Я думаю, что каждый должен быть точным в позиционировании типа файла: он просто абстрактно представляет файл или каталог на диске, и на самом деле он зависит от класса локальной системы локальной системы, независимого от платформы, и файл не может выполнять какие-либо операции чтения и записи на содержимое файла, которое он представляет (то есть то, что делает поток).
Создайте экземпляр файла
Прежде чем фактически представить метод конструктора экземпляра файла, нам нужно взглянуть на его несколько важных членов атрибута.
Private Static Final FileSystem fs = defaultfilesyStem.getFilesyStem ();
Это самый основной член класса файлов, который представлен как API файловой системы текущей системы. Все операции, выпущенные на диск, основаны на этом имуществе.
частный финальный путь строки;
Путь представляет полное имя пути текущего экземпляра. Если текущий экземпляр файла представляет собой каталог, то значение пути является полным именем каталога. Если он представляет собой чистый файл, то значение этого пути равно полному пути файла + имя файла.
Public Static Final CHAR SEATATORCHAR = FS.GETSEPARATOR (); Public Static Final PatseParatorChar = fs.getPathSeparator ();
SeparatorChar представляет сепаратор между каталогами, а PathSparatorChar представляет сепаратор в разных путях. Эти два значения различны на разных системных платформах. Например, значения этих двух под Windows: «» и «;»; », где запрет используется для разделения нескольких разных путей.
Класс файлов предоставляет четыре различных конструктора для создания объекта файла, но только три чаще используются. Мы также сосредоточены на изучении первых трех конструкторов.
public file (String Pathname)
Это самый распространенный способ создания объекта файла. Значение PathName может быть каталогом или простой именем файла. Например:
File file = new File ("c: // users // yanga // desktop"); файл файла1 = новый файл ("c: //users//yanga//desktop//a.txt"); file2 = new File ("a.txt");Конечно, вы также можете явно указать родительский путь:
Общедоступный файл (String Parent, String Child)
Внутри конструктора программа будет разыскивать полный путь файла для нас, например:
File file = new File ("c: // users // yanga // desktop", "a.txt"); file1 = new File ("c: // users // yanga // desktop", "java");Третий конструктор по сути такой же, как у второго, за исключением того, что он добавляет процесс инкапсуляции экземпляра родительского файла:
Общедоступный файл (файл родителей, строка ребенка)
Подобные ситуации не будут объяснены. Мы не углубились в внутреннюю конкретную реализацию этих конструкторов здесь. Дело не в том, что это просто. Вместо этого файл слишком сильно полагается на локальную файловую систему, и реализация многих методов не может быть напрямую. Следовательно, для изучения файла достаточно, чтобы быть опытным в его освоении, и конкретная реализация не может быть изучен в настоящее время.
Получить информацию, связанную с именем файла или пути
Метод getName может быть использован для получения имени файла:
public String getName () {int index = path.lastIndexof (seperatorChar); if (index <prefixLength) возвращаемый путь. Substring (PrefixLength); возврат path.substring (index + 1);}Помните, что представляет наш разборчик?
Он представлен как сепаратор пути, символ «в Windows хранится в атрибуте Path, и полное имя пути текущего экземпляра файла, поэтому все символы после последнего вхождения должны быть нашим именем файла.
Конечно, вы должны обнаружить, что для чистых файлов этот метод может вернуть простое имя файла, в то время как для каталога возвратное значение будет самым последним именем каталога. Например:
File file = new File ("c: //users//yanga//desktop//a.txt"); System.out.println (file.getName ()); file file1 = new File ("c: // users // yanga // desktop"); system.out.println ("file1.getname ());Вывод не удивит вас:
A.txtdesktop
Метод GetParent используется для возврата родительского каталога текущего файла. Независимо от того, являетесь ли вы простым файлом или каталогом, у вас в конечном итоге будет ваш родительский каталог (конечно, временные файлы, сгенерированные виртуальной машиной, конечно, не являются, конечно).
public String getParent () {int index = path.lastindexof (seperatorChar); if (index <prefixLength) {if ((prefixLength> 0) && (path.length ()> prefixLength)) return path.substring (0, prefixlength); вернуть ноль; } return path.substring (0, index);}Реализация метода очень проста, поэтому я не буду вдаваться в подробности.
Метод GetPath может вернуть полное имя файла текущего экземпляра файла:
public String getPath () {return Path;}Ниже приведены некоторые связанные операции, связанные с каталогами, которые относительно просты в реализации. Вот краткий список:
Здесь нам нужно объяснить некоторое объяснение GetCanonicalPath, что такое стандартный путь, и есть ли какая -то разница между абсолютным путем?
Вообще говоря, «../» означает предыдущий каталог каталога, в котором находится исходный файл », ../../" означает предыдущий каталог каталога, где находится исходный файл, и так далее. Метод GetabSolutePath не выполняет такие операции конверсии, в то время как метод getCanonicalPath распознает эти специальные символы и принимает соответствующую семантику.
Например:
File file = new File ("..// A.txt"); System.out.println (file.getAbsolutePath ()); System.out.println (file.getCanonicalPath ());Результат вывода:
C:/users/yanga/desktop/java/workspace2017/testfile /../ a.txt
C: /users/yanga/desktop/java/workspace2017/a.txt
Первый будет использовать «../a.txt» как часть имени пути файла, в то время как последний может признать, что «.../a.txt» означает, что «a.txt» находится в верхнем каталоге текущего каталога. Это самая большая разница между двумя, подходит для разных ситуаций.
Получить информацию атрибута файла
Операция этой части файла на самом деле очень проста, это не что иное, как некоторые вопросы о разрешениях файлов, независимо от того, читается ли он, независимо от того, подходит ли он, будь то скрытый файл и т. Д. Посмотрим на эти методы подробно:
Следует отметить, что метод длины может правильно вернуть общее количество байтов файла для чистого файла, но для каталога возвратное значение будет «неопределенным» значением, которое не является ни общим количеством байтов всех файлов в каталоге, ни ноль, но является просто неопределенным значением, что не имеет значения.
Операция файла
Работа файлов - это не что иное, как «добавление, удаление, модификация и поиск». Давайте посмотрим вместе.
Конечно, при работе с двумя вышеупомянутыми новыми операциями создания и удаления, класс файлов также предоставляет так называемые операции «запрос», которые нам нужно тщательно учиться. Например:
public String [] list () {SecurityManager Security = System.getSecurityManager (); if (security! = null) {security.checkread (path); } if (isInvalid ()) {return null; } return fs.list (this);}Этот метод извлечет все простые имена «чистых файлов» и «каталога» в каталоге, представленном текущим экземпляром. Например:
File file = new File ("c: // users // yanga // desktop"); string [] list = file.list (); for (String Str: list) {System.out.println (str);}Результатом вывода программы будет распечатать простые имена всех файлов в каталоге моего компьютера, поэтому я не буду показывать это вам.
Обратите внимание, что если наш экземпляр файла не соответствует каталогу, а в простом файле, то список вернет NULL.
Далее, давайте посмотрим на метод получения файлов каталогов:
public String [] List (FilenameFilter Filter) {String names [] = list (); if ((имена == null) || (filter == null)) {return names; } List <string> v = new ArrayList <> (); for (int i = 0; i <names.length; i ++) {if (filter.accep (this, names [i])) {v.add (names [i]); }} return v.toarray (new String [v.size ()]);}Этот метод на самом деле представляет собой перегруженную версию списка, которая позволяет вам передать фильтр, чтобы фильтровать только файлы и каталоги, которые нам нужны при поиске каталогов.
Но определение интерфейса FileFilter настолько просто:
Общедоступный интерфейс FileFilter {Boolean Accept (файл Dir, String name);}Вам нужно только переопределить этот метод принятия. Каждый раз, когда список для цикла получает файл или каталог, он будет пытаться сначала вызвать этот метод фильтрации. Если вы передаете фильтрацию, простое имя текущего файла будет добавлено в коллекцию возврата.
Следовательно, переписывание этого метода принятия определяет, какие файлы могут передавать фильтрацию, а какие не могут. Давайте посмотрим на пример:
Файлы в тестовой папке на моем рабочем столе следующие:
File file = new File ("c: // users // yanga // desktop // test"); String [] list = file.list (new FilenAmeFilter () {@Override public boolean access (file dir, string name) {// текущий объект файла, представленная Dir // именем, является простой именем элемента файла в настоящее время uperavers (! Name.endswith (". Txt")) вернуть false; else return true;}}); for (String Str: list) {System.out.println (str); }Здесь мы используем анонимный внутренний класс для создания экземпляра подкласса FilenameFilter, а затем реализуем его метод приема. Конкретная реализация очень проста, отфильтровала все каталоги и выявляет простые имена всех простых файлов.
Окончательный результат вывода заключается в следующем:
3.txt
4.txt
Конечно, в классе файлов также есть два «мутированных» метода списка, например:
Они больше не возвращают простые имена «чистых файлов» и «каталогов» в целевом каталоге, но возвращают соответствующий объект файла. На самом деле, это ничто. Целевой каталог + простое имя может создать эти экземпляры файлов.
Следовательно, по сути, метод списка не будет пересекать все файлы в целевом каталоге, то есть файлы в подкаталоге целевого каталога не будут доступны и пройдены.
Таким образом, вы должны подумать о том, как пройти все файлы в целевом каталоге, включая глубокие файлы в подкаталогах первого уровня. Ответ будет дан в конце статьи.
Следующие два метода связаны с созданием папок:
Оба основаны на текущем экземпляре файла для создания папок. Что касается их различий, давайте сначала посмотрим на кусок кода:
File file = new File ("c: // users // yanga // desktop // test2"); system.out.println (file.mkdir ()); file2 = new File ("c: // users // yanga // desktop // test3 // hello"); System.out.println (file2.mkdir ());Среди них Test2 и Test3 не существуют, пока программа не будет выполнена.
Результат вывода заключается в следующем:
истинный
ЛОЖЬ
Почему последнее не смогло создать?
Это связано с тем, что метод MKDIR может создавать только одну папку за раз, что вызовет сбой создания, если родитель или более высокий каталог данного каталога существует не созданный каталог.
Метод MKDIRS используется для решения этой ситуации. Он создаст все не созданные каталоги на целевом пути, см. Код:
File file3 = новый файл ("c: // users // yanga // desktop // test3 // hello // 231"); system.out.println (file3.mkdirs ());Даже если нашей папки Test3 не существует, после запуска программы будет создано трех папок Test3, Hello и 231.
Кроме того, файл также имеет метод создания временных файлов. Так называемые временные файлы: они существуют во время выполнения и уничтожаются, когда виртуальная машина выключена. Вы можете изучить это самостоятельно. Это относительно просто в использовании, поэтому я не буду вдаваться в подробности здесь.
На этом этапе мы примерно узнали о файле типа файла. Я считаю, что все будут более или менее чувствовать, что дизайн представления чистых файлов и каталогов с использованием одного и того же типа кажется немного запутанным и необоснованным. Я знаю, что JDK1.7 Sun запустила файлы и путь к отдельным файлам и каталогам, и мы узнаем больше об этом в будущих статьях.
Все коды, изображения и файлы в статье хранятся в облаке на моем GitHub:
(https://github.com/singleyam/overview_java)
Вы также можете загрузить локально.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.