Java Language Migration de java.io.File vers Java 7 NIO (java.nio.file.Path)


Exemple

Ces exemples supposent que vous connaissez déjà le NIO de Java 7 en général et que vous avez l'habitude d'écrire du code en utilisant java.io.File . Utilisez ces exemples pour trouver rapidement une documentation plus centrée sur NIO pour la migration.

Il y a beaucoup plus à NIO de Java 7, comme les fichiers mappés en mémoire ou l' ouverture d'un fichier ZIP ou JAR à l'aide de FileSystem . Ces exemples ne couvriront qu'un nombre limité de cas d'utilisation de base.

En règle générale, si vous avez l'habitude d'effectuer une opération de lecture / écriture du système de fichiers à l'aide d'une méthode d'instance java.io.File , vous la trouverez en tant que méthode statique dans java.nio.file.Files .

Pointez sur un chemin

// -> IO
File file = new File("io.txt");

// -> NIO
Path path = Paths.get("nio.txt");

Chemins relatifs à un autre chemin

// Forward slashes can be used in place of backslashes even on a Windows operating system
// -> IO
File folder = new File("C:/");
File fileInFolder = new File(folder, "io.txt");

// -> NIO
Path directory = Paths.get("C:/");
Path pathInDirectory = directory.resolve("nio.txt");

Conversion de fichier depuis / vers un chemin pour une utilisation avec des bibliothèques

// -> IO to NIO
Path pathFromFile = new File("io.txt").toPath();

// -> NIO to IO
File fileFromPath = Paths.get("nio.txt").toFile();

Vérifiez si le fichier existe et supprimez-le s'il le fait

// -> IO
if (file.exists()) {
    boolean deleted = file.delete();
    if (!deleted) {
        throw new IOException("Unable to delete file");
    }
}

// -> NIO
Files.deleteIfExists(path);

Ecrire dans un fichier via un OutputStream

Il existe plusieurs manières d'écrire et de lire un fichier à l'aide de NIO pour différentes contraintes de performances et de mémoire, de lisibilité et de cas d'utilisation, tels que FileChannel , Files.write(Path path, byte\[\] bytes, OpenOption... options) . .. Dans cet exemple, seul OutputStream est couvert, mais vous êtes fortement encouragé à en apprendre davantage sur les fichiers mappés en mémoire et les différentes méthodes statiques disponibles dans java.nio.file.Files .

List<String> lines = Arrays.asList(
        String.valueOf(Calendar.getInstance().getTimeInMillis()),
        "line one",
        "line two");

// -> IO
if (file.exists()) {
    // Note: Not atomic
    throw new IOException("File already exists");
}
try (FileOutputStream outputStream = new FileOutputStream(file)) {
    for (String line : lines) {
        outputStream.write((line + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
    }
}

// -> NIO
try (OutputStream outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW)) {
    for (String line : lines) {
        outputStream.write((line + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
    }
}

Itération sur chaque fichier dans un dossier

// -> IO
for (File selectedFile : folder.listFiles()) {
    // Note: Depending on the number of files in the directory folder.listFiles() may take a long time to return
    System.out.println((selectedFile.isDirectory() ? "d" : "f") + " " + selectedFile.getAbsolutePath());
}

// -> NIO
Files.walkFileTree(directory, EnumSet.noneOf(FileVisitOption.class), 1, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path selectedPath, BasicFileAttributes attrs) throws IOException {
        System.out.println("d " + selectedPath.toAbsolutePath());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path selectedPath, BasicFileAttributes attrs) throws IOException {
        System.out.println("f " + selectedPath.toAbsolutePath());
        return FileVisitResult.CONTINUE;
    }
});

Itération du dossier récursif

// -> IO
recurseFolder(folder);

// -> NIO
// Note: Symbolic links are NOT followed unless explicitly passed as an argument to Files.walkFileTree
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        System.out.println("d " + selectedPath.toAbsolutePath());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path selectedPath, BasicFileAttributes attrs) throws IOException {
        System.out.println("f " + selectedPath.toAbsolutePath());
        return FileVisitResult.CONTINUE;
    }
});


private static void recurseFolder(File folder) {
    for (File selectedFile : folder.listFiles()) {
        System.out.println((selectedFile.isDirectory() ? "d" : "f") + " " + selectedFile.getAbsolutePath());
        if (selectedFile.isDirectory()) {
            // Note: Symbolic links are followed
            recurseFolder(selectedFile);
        }
    }
}