In Java, for NIO Path, we can use path.toAbsolutePath() to get the file path; For legacy IO File, we can use file.getAbsolutePath() to get the file path.

For symbolic links or file path contains . or .., we can use path.toRealPath() or file.getCanonicalPath() to get the real file pah.

Below is the mapping of File and Path.

  1. file.getAbsolutePath() <=> path.toAbsolutePath()
  2. file.getCanonicalPath() <=> path.toRealPath()
  3. file.getParent() <=> path.getParent()

1. Get file path of a file (NIO Path).

For java.nio.file.Path, we can use the following APIs to get the file path of a file.

  1. path.toAbsolutePath() – Full file path.
  2. path.toRealPath()) – For symbolic links or resolving the . or .. symbols in the path name, default it follow link.
  3. path.getParent() – Get parent directory of the path.

1.1 Path = /home/tvt/workspace/favtuts/test/file.txt

Path path = Paths.get("/home/tvt/workspace/favtuts/test/file.txt");

path                      : /home/tvt/workspace/favtuts/test/file.txt
path.toAbsolutePath()     : /home/tvt/workspace/favtuts/test/file.txt
path.getParent()          : /home/tvt/workspace/favtuts/test
path.toRealPath()         : /home/tvt/workspace/favtuts/test/file.txt

1.2 Path = file.txt, the file is refer to the current working directory + file.txt.

Path path = Paths.get("file.txt");

path                      : file.txt
path.toAbsolutePath()     : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt
path.getParent()          : null
path.toRealPath()         : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt

1.3 Path = /home/tvt/workspace/favtuts/test/soft-link, a symbolic link.

$ ln -s /home/tvt/workspace/favtuts/test/test-b/test-d/test-d2.log /home/tvt/workspace/favtuts/test/soft-link
Path path = Paths.get("/home/tvt/workspace/favtuts/test/soft-link");

path                      : /home/tvt/workspace/favtuts/test/soft-link
path.toAbsolutePath()     : /home/tvt/workspace/favtuts/test/soft-link
path.getParent()          : /home/tvt/workspace/favtuts/test
path.toRealPath()         : /home/tvt/workspace/favtuts/test/test-b/test-d/test-d2.log

1.4 Path = /home/tvt/workspace/favtuts/test/../hello.txt

Path path = Paths.get("/home/tvt/workspace/favtuts/test/../hello.txt");

path                      : /home/tvt/workspace/favtuts/test/../hello.txt
path.toAbsolutePath()     : /home/tvt/workspace/favtuts/test/../hello.txt
path.getParent()          : /home/tvt/workspace/favtuts/test..
path.toRealPath()         : /home/tvt/workspace/favtuts/hello.txt

1.5 Below is a complete Java example to get the file path of different Path.

GetFilePath1.java

package com.favtuts.io.howto;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;

public class GetFilePath {
    
    public static void main(String[] args) {

        // full path
        Path path1 = Paths.get("/home/tvt/workspace/favtuts/test/file.txt");
        System.out.println("\n[Path] : " + path1);
        printPath(path1);

        // file name
        Path path2 = Paths.get("file.txt");
        System.out.println("\n[Path] : " + path2);
        printPath(path2);

        // soft or symbolic link
        Path path3 = Paths.get("/home/tvt/workspace/favtuts/test/soft-link");
        System.out.println("\n[Path] : " + path3);
        printPath(path3);

        // a path contains `..`
        Path path4 = Paths.get("/home/tvt/workspace/favtuts/test/../hello.txt");
        System.out.println("\n[Path] : " + path4);
        printPath(path4);
        
    }

    static void printPath(Path path) {

        System.out.printf("%-25s : %s%n", "path", path);
        System.out.printf("%-25s : %s%n", "path.toAbsolutePath()",
                                                path.toAbsolutePath());
        System.out.printf("%-25s : %s%n", "path.getParent()", path.getParent());
        System.out.printf("%-25s : %s%n", "path.getRoot()", path.getRoot());

        try {

            if (Files.notExists(path)) {
                return;
            }

            // default, follow symbolic link
            System.out.printf("%-25s : %s%n", "path.toRealPath()",
                                                  path.toRealPath());
            // no follow symbolic link
            System.out.printf("%-25s : %s%n", "path.toRealPath(nofollow)",
                path.toRealPath(LinkOption.NOFOLLOW_LINKS));

            // alternative to check isSymbolicLink
            /*if (Files.isSymbolicLink(path)) {
                Path link = Files.readSymbolicLink(path);
                System.out.println(link);
            }*/

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Output

[Path] : /home/tvt/workspace/favtuts/test/file.txt
path                      : /home/tvt/workspace/favtuts/test/file.txt
path.toAbsolutePath()     : /home/tvt/workspace/favtuts/test/file.txt
path.getParent()          : /home/tvt/workspace/favtuts/test
path.getRoot()            : /
path.toRealPath()         : /home/tvt/workspace/favtuts/test/file.txt
path.toRealPath(nofollow) : /home/tvt/workspace/favtuts/test/file.txt

[Path] : file.txt
path                      : file.txt
path.toAbsolutePath()     : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt
path.getParent()          : null
path.getRoot()            : null
path.toRealPath()         : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt
path.toRealPath(nofollow) : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt

[Path] : /home/tvt/workspace/favtuts/test/soft-link
path                      : /home/tvt/workspace/favtuts/test/soft-link
path.toAbsolutePath()     : /home/tvt/workspace/favtuts/test/soft-link
path.getParent()          : /home/tvt/workspace/favtuts/test
path.getRoot()            : /
path.toRealPath()         : /home/tvt/workspace/favtuts/test/test-b/test-d/test-d2.log
path.toRealPath(nofollow) : /home/tvt/workspace/favtuts/test/soft-link

[Path] : /home/tvt/workspace/favtuts/test/../hello.txt
path                      : /home/tvt/workspace/favtuts/test/../hello.txt
path.toAbsolutePath()     : /home/tvt/workspace/favtuts/test/../hello.txt
path.getParent()          : /home/tvt/workspace/favtuts/test/..
path.getRoot()            : /
path.toRealPath()         : /home/tvt/workspace/favtuts/hello.txt
path.toRealPath(nofollow) : /home/tvt/workspace/favtuts/hello.txt

2. Get file path of a file (legacy File)

For the legacy IO java.io.File, we can use the following APIs to get the file path of a file.

  1. file.getAbsolutePath() = path.toAbsolutePath()
  2. file.getCanonicalPath() = path.toRealPath()
  3. file.getParent() = path.getParent()

GetFilePath2.java

package com.favtuts.io.howto;

import java.io.File;
import java.io.IOException;

public class GetFilePath {
    
    public static void main(String[] args) {

         // Java Legacy IO
         // full file path
         File file1 = new File("/home/tvt/workspace/favtuts/test/file.txt");
         System.out.println("[File] : " + file1);
         printFilePath(file1);
 
         // a file name
         File file2 = new File("file.txt");
         System.out.println("\n[File] : " + file2);
         printFilePath(file2);
 
         // a soft or symbolic link
         File file3 = new File("/home/tvt/workspace/favtuts/test/soft-link");
         System.out.println("\n[File] : " + file3);
         printFilePath(file3);
 
         // a file contain `..`
         File file4 = new File("/home/tvt/workspace/favtuts/test/../hello.txt");
         System.out.println("\n[File] : " + file4);
         printFilePath(file4);
        
    }


    // If a single file name, not full path, the file refer to
    // System.getProperty("user.dir") + file
    static void printFilePath(File file) {
        // print File = print file.getPath()
        System.out.printf("%-25s : %s%n", "file.getPath()", file.getPath());
        System.out.printf("%-25s : %s%n", "file.getAbsolutePath()",
                                              file.getAbsolutePath());
        try {
            System.out.printf("%-25s : %s%n", "file.getCanonicalPath()",
                                                file.getCanonicalPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.printf("%-25s : %s%n", "Parent Path", getParentPath(file));
    }

    // if unable to get parent, try substring to get the parent folder.
    private static String getParentPath(File file) {
        if (file.getParent() == null) {
            String absolutePath = file.getAbsolutePath();
            return absolutePath.substring(0,
                          absolutePath.lastIndexOf(File.separator));
        } else {
            return file.getParent();
        }
    }
}

Output

[File] : /home/tvt/workspace/favtuts/test/file.txt
file.getPath()            : /home/tvt/workspace/favtuts/test/file.txt
file.getAbsolutePath()    : /home/tvt/workspace/favtuts/test/file.txt
file.getCanonicalPath()   : /home/tvt/workspace/favtuts/test/file.txt
Parent Path               : /home/tvt/workspace/favtuts/test

[File] : file.txt
file.getPath()            : file.txt
file.getAbsolutePath()    : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt
file.getCanonicalPath()   : /home/tvt/favtuts/java-core-tutorials-examples/java-io/file.txt
Parent Path               : /home/tvt/favtuts/java-core-tutorials-examples/java-io

[File] : /home/tvt/workspace/favtuts/test/soft-link
file.getPath()            : /home/tvt/workspace/favtuts/test/soft-link
file.getAbsolutePath()    : /home/tvt/workspace/favtuts/test/soft-link
file.getCanonicalPath()   : /home/tvt/workspace/favtuts/test/test-b/test-d/test-d2.log
Parent Path               : /home/tvt/workspace/favtuts/test

[File] : /home/tvt/workspace/favtuts/test/../hello.txt
file.getPath()            : /home/tvt/workspace/favtuts/test/../hello.txt
file.getAbsolutePath()    : /home/tvt/workspace/favtuts/test/../hello.txt
file.getCanonicalPath()   : /home/tvt/workspace/favtuts/hello.txt
Parent Path               : /home/tvt/workspace/favtuts/test/..

Download Source Code

$ git clone https://github.com/favtuts/java-core-tutorials-examples

$ cd java-io/howto

References

Leave a Reply

Your email address will not be published. Required fields are marked *