Статьи

Основы ввода / вывода Java-файлов

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 . Внутри много полезного.