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 first Files.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 file Files.delete(Paths.get( "/foo/bar.txt" )); // Delete a file but do not fail if the file does not exist Files.deleteIfExists(Paths.get( "/foo/bar.txt" )); // Check if a file exists boolean 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 file List<String> lines = Arrays.asList( "first" , "second" , "third" ); Files.write(Paths.get( "/foo/bar.txt" ), lines, Charset.forName( "UTF-8" )); // Read lines List<String> lines = Files.readAllLines(Paths.get( "/foo/bar.txt" ), Charset.forName( "UTF-8" )); |
Показанные методы работают с персонажами. Подобные методы доступны, если вам нужно работать с байтами.
Вывод
Если вы не знали о java.nio.file.Files, вам обязательно нужно взглянуть на сводку методов Javadoc . Внутри много полезного.
Ссылка: | Основы ввода / вывода Java-файлов от нашего партнера по JCG Майкла Шаргага в блоге mscharhag, Programming and Stuff . |