John M
John M

Reputation: 23

Java Path exception

So, I used java.io.File for basically everything before. But now, when switching to java.nio.Path, I'm experiencing a few problems...

What I use it for is basically loading/saving files, on my program startup and shutdown.

I use it in multiple places but I'll type an example:

  Objects.requireNonNull(directory, "directory");

    if (this.myObjectMap.isEmpty()) {
        return;
    }

    Files.list(directory).forEach(file -> {
        try {
            Files.deleteIfExists(file);
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    });

    Files.createDirectories(directory);

    for (Object object : this.myObjectMap.values()) {
        Path destination = directory.resolve(object.toString() + ".json");

        Files.deleteIfExists(destination);
        Files.createFile(destination);

        JsonObject properties = new JsonObject();

        JSONFileHandler.save(destination, properties);
    }

My problem is that everytime I do something similar to this, it throws a NoSuchFileException exception before even using the Path... But I don't know what I'm doing wrong, since I check if it exists after creating the Path.

Update

The exception stacktrace is the following:

java.nio.file.NoSuchFileException: **the directory**

at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsDirectoryStream.<init>(WindowsDirectoryStream.java:86)
at sun.nio.fs.WindowsFileSystemProvider.newDirectoryStream(WindowsFileSystemProvider.java:518)
at java.nio.file.Files.newDirectoryStream(Files.java:457)
at java.nio.file.Files.list(Files.java:3451)

Upvotes: 1

Views: 3891

Answers (1)

Darshan Mehta
Darshan Mehta

Reputation: 30809

Here's the javadoc for Path, this is what it says:

An object that may be used to locate a file in a file system. It will typically represent a system dependent file path.

So, a Path just represents a Path, it's not a pointer to an existing file or directory and hence, it may or may not exist.

In our example, we need to check whether the Path exists, before calling Files.list and that would make sure we are iterating through valid path, e.g.:

Path directory = Paths.get("some directory");
Objects.requireNonNull(directory, "directory");
if(Files.exists(directory)){
    Files.list(directory).forEach(file -> {
        try {
            System.out.println(file);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    });
}

Upvotes: 2

Related Questions