Java 7 представила пакет java.nio.file, чтобы обеспечить всестороннюю поддержку файлового ввода-вывода. Помимо множества других функций этот пакет включает в себя класс Files (если вы уже используете этот класс, вы можете перестать читать здесь).
Файлы содержат множество статических методов, которые можно использовать для выполнения общих задач при работе с файлами. К сожалению, мне кажется, что еще много нового (Java 7+) кода написано с использованием старых (до Java 7) способов работы с файлами. Это не должно быть плохо, но это может сделать вещи более сложными, чем необходимо. Возможная причина этого может заключаться в том, что перед выпуском Java 7 было написано много статей и высоко оцененных ответов Stackoverflow.
В оставшейся части этого поста я приведу несколько примеров кода, которые показывают, как вы можете выполнять общие задачи, связанные с файлами, с помощью Java 7 или новее.
Работа с файлами
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
// Create directories// This will create the "bar" directory in "/foo"// If "/foo" does not exist, it will be created firstFiles.createDirectories(Paths.get("/foo/bar"));// Copy a file// This copies the file "/foo/bar.txt" to "/foo/baz.txt"Files.copy(Paths.get("/foo/bar.txt"), Paths.get("/foo/baz.txt"));// Move a file// This moves the file "/foo/bar.txt" to "/foo/baz.txt"Files.move(Paths.get("/foo/bar.txt"), Paths.get("/foo/baz.txt"));// Delete a fileFiles.delete(Paths.get("/foo/bar.txt"));// Delete a file but do not fail if the file does not existFiles.deleteIfExists(Paths.get("/foo/bar.txt"));// Check if a file existsboolean exists = Files.exists(Paths.get("/foo/bar.txt")); |
Большинство методов файлов принимают один или несколько аргументов типа Path. Экземпляры пути представляют собой путь к файлу или каталогу и могут быть получены с помощью Paths.get (). Обратите внимание, что большинство методов, показанных здесь, также имеют дополнительный параметр varargs, который можно использовать для передачи дополнительных параметров.
Например:
|
1
|
Files.copy(Paths.get("/foo.txt"), Paths.get("/bar.txt"), StandardCopyOption.REPLACE_EXISTING); |
Итерация по всем файлам в каталоге
|
1
2
3
4
5
6
7
|
Files.walkFileTree(Paths.get("/foo"), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.out.println("file: " + file); return FileVisitResult.CONTINUE; }}); |
Здесь метод visitFile () будет вызываться для каждого файла в каталоге / foo. Вы можете переопределить дополнительные методы SimpleFileVisitor, если вы тоже хотите отслеживать каталоги.
Написание и чтение файлов
|
1
2
3
4
5
6
|
// Write lines to fileList<String> lines = Arrays.asList("first", "second", "third");Files.write(Paths.get("/foo/bar.txt"), lines, Charset.forName("UTF-8"));// Read linesList<String> lines = Files.readAllLines(Paths.get("/foo/bar.txt"), Charset.forName("UTF-8")); |
Показанные методы работают с персонажами. Подобные методы доступны, если вам нужно работать с байтами.
Вывод
Если вы не знали о java.nio.file.Files, вам обязательно нужно взглянуть на сводку методов Javadoc . Внутри много полезного.
| Ссылка: | Основы ввода / вывода Java-файлов от нашего партнера по JCG Майкла Шаргага в блоге mscharhag, Programming and Stuff . |