Spec-Zone .ru
спецификации, руководства, описания, API
|
Files
class является другим основным entrypoint java.nio.file
пакет. Этот class предлагает богатый набор статических методов для того, чтобы считать, писать, и управлять файлами и каталогами. Files
методы работают над экземплярами Path
объекты. Прежде, чем продолжить к остающимся разделам, следует ознакомить себя со следующими общими понятиями:
Многие из ресурсов, которые используются в этом API, таком как потоки или каналы, реализуют или расширяются java.io.Closeable
Closeable
ресурс то, что close
метод должен быть вызван, чтобы выпустить ресурс когда больше не требующийся. У пренебрежения закрыть ресурс может быть отрицательная импликация на производительности приложения. try-
оператор с ресурсами, описанный в следующем разделе, обрабатывает этот шаг для Вас.
С файловым вводом-выводом неожиданные условия являются фактом жизни: файл существует (или не существует), когда ожидающийся, у программы нет доступа к файловой системе, реализация файловой системы значения по умолчанию не поддерживает определенную функцию и так далее. Можно встретиться с многочисленными ошибками.
Все методы, которые получают доступ к файловой системе, могут бросить IOException
. Это - передовая практика, чтобы поймать эти исключения, встраивая эти методы в a try-
оператор с ресурсами, представленный в Java SE 7 выпусков. try-
у оператора с ресурсами есть преимущество, что компилятор автоматически генерирует код, чтобы закрыть ресурс (ы) когда больше не требующийся. Следующий код показывает, как это могло бы смотреть:
Charset charset = Charset.forName("US-ASCII"); String s = ...; try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) { writer.write(s, 0, s.length()); } catch (IOException x) { System.err.format("IOException: %s%n", x); }
Для получения дополнительной информации см.
Альтернативно, можно встроить методы файлового ввода-вывода в a try
блок и затем ловит любые исключения в a catch
блок. Если Ваш код открыл какие-либо потоки или каналы, следует закрыть их в a finally
блок. Предыдущий пример смотрел бы что-то как следующее использование подхода "выгода попытки наконец":
Charset charset = Charset.forName("US-ASCII"); String s = ...; BufferedWriter writer = null; try { writer = Files.newBufferedWriter(file, charset); writer.write(s, 0, s.length()); } catch (IOException x) { System.err.format("IOException: %s%n", x); } finally { if (writer != null) writer.close(); }
Для получения дополнительной информации см. Ловлю и Обработку Исключений.
В дополнение к IOException
, много определенных исключений расширяются FileSystemException
. У этого class есть некоторые полезные методы, которые возвращают включенный файл getFile
)getMessage
)getReason
)getOtherFile
)
Следующий фрагмент кода показывает как getFile
метод мог бы использоваться:
try (...) { ... } catch (NoSuchFileException x) { System.err.format("%s does not exist\n", x.getFile()); }
В целях ясности примеры файлового ввода-вывода в этом уроке, возможно, не показывают обработку исключений, но Ваш код должен всегда включать это.
Несколько Files
методы принимают произвольное число параметров, когда флаги определяются. Например, в следующей сигнатуре метода, нотации эллипсов после CopyOption
параметр указывает, что метод принимает переменное число параметров, или varargs, как их обычно вызывают:
Path Files.move(Path, Path, CopyOption...)
Когда метод принимает varargs параметр, можно передать его список разделенных запятой значений значений или массива (CopyOption[]
) из значений.
В move
пример, метод может быть вызван следующим образом:
import static java.nio.file.StandardCopyOption.*; Path source = ...; Path target = ...; Files.move(source, target, REPLACE_EXISTING, ATOMIC_MOVE);
Для получения дополнительной информации о varargs синтаксисе, см.
Несколько Files
методы, такой как move
, может выполнить определенные операции атомарно в некоторых файловых системах.
Атомарная работа файла является работой, которая не может быть прервана или "частично" выполнена. Или вся работа выполняется или сбои работы. Это важно, когда у Вас будут многократные процессы, работающие на той же самой области файловой системы, и Вы должны гарантировать, что каждый процесс получает доступ к полному файлу.
Многие из методов файлового ввода-вывода поддерживают понятие объединения в цепочку метода.
Вы сначала вызываете метод, который возвращает объект. Вы тогда сразу вызываете метод на тот объект, который возвращает еще один объект и так далее. Многие из примеров ввода-вывода используют следующий метод:
String value = Charset.defaultCharset().decode(buf).toString(); UserPrincipal group = file.getFileSystem().getUserPrincipalLookupService(). lookupPrincipalByName("me");
Этот метод производит компактный код и позволяет Вам избежать объявлять временные переменные, в которых Вы не нуждаетесь.
Два метода в Files
class принимает параметр шарика, но каков шарик?
Можно использовать синтаксис шарика, чтобы определить поведение сопоставления с образцом.
Образец шарика определяется как строка и соответствующий против других строк, таких как имена каталогов или имена файлов. Синтаксис шарика следует за несколькими простыми правилами:
*
, соответствия любое число символов (включая ни один).**
, работы как *
но перекрестные границы каталога. Этот синтаксис обычно используется для того, чтобы соответствовать полные пути.?
, соответствия точно один символ.{sun,moon,stars}
соответствия "солнце", "луна", или "звезды".{temp*,tmp*}
соответствия все строки, начинающиеся "с временного файла" или "tmp".-
) используется, диапазон символов. Например: [aeiou]
соответствия любой строчный гласный.[0-9]
соответствия любая цифра.[A-Z]
соответствия любая прописная буква.[a-z,A-Z]
соответствия любая прописная или строчная буква.*
, ?
, и \
соответствуйте себя.*
, ?
, или другие специальные символы, можно выйти из них при использовании символа наклонной черты влево, \
. Например: \\
соответствует единственную наклонную черту влево, и \?
соответствует вопросительный знак.Вот некоторые примеры синтаксиса шарика:
*.html
– Соответствия все строки тот конец в.html???
– Соответствия все строки точно с тремя буквами или цифрами*[0-9]*
– Соответствия все строки, содержащие числовое значение*.{htm,html,pdf}
– Соответствия любая строка, заканчивающаяся.htm.html или.pdfa?*.java
– Соответствия любая начинающаяся строка a
, сопровождаемый по крайней мере одной буквой или цифрой, и заканчивающийся.java{foo*,*[0-9]*}
– Соответствия любая строка, начинающаяся foo или любая строка, содержащая числовое значение"*"
), используйте наклонную черту влево (\*
), или использование безотносительно механизма escape поддерживается в командной строке. Синтаксис шарика мощен и удобен. Однако, если это не достаточно для Ваших потребностей, можно также использовать регулярное выражение. Для получения дополнительной информации см. урок Регулярных выражений.
Для получения дополнительной информации о шарике sytnax, см. спецификацию API для getPathMatcher
метод в FileSystem
class.
Files
class является "знающей ссылкой." Каждый Files
метод или обнаруживает, что сделать, когда с символьной ссылкой встречаются, или это предоставляет возможность, позволяющую Вам сконфигурировать поведение, когда с символьной ссылкой встречаются.