How to construct a relative path in Java from two absolute paths (or URLs)?
It's a little roundabout, but why not use URI? It has a relativize method which does all the necessary checks for you.
String path = "/var/data/stuff/xyz.dat";
String base = "/var/data";
String relative = new File(base).toURI().relativize(new File(path).toURI()).getPath();
// relative == "stuff/xyz.dat"
Please note that for file path there's java.nio.file.Path#relativize
since Java 1.7, as pointed out by @Jirka Meluzin in the other answer.
Find relative path from one URL to another in Java
Java
already offers this functionality, so the safest option would be to go the "standard" way:
String url1 = "http://foo.com/bar/baz";
String url2 = "http://foo.com/bar/qux/quux/corge";
Path p1 = Paths.get(url1);
Path p2 = Paths.get(url2);
Path p = p1.relativize(p2);
System.out.println("Relative path: " + p);
The print
statement above shows the correct relative path - i.e., in this case,
../qux/quux/corge
If the protocol (e.g., http vs https) and host parts can be different, then converting url1
and url2
above, into URL
objectsand using the
getPath()` method, should yield the correct relative path.
Construct a relative path in JavaScript from two absolute paths
If you're running this on the server with node.js:
http://nodejs.org/api/path.html#path_path_relative_from_to
This is their implementation:
https://github.com/joyent/node/blob/master/lib/path.js#L233
This should work in the browser without really any changes. It's been battle-tested, so it already handles edge cases. It's not a one-liner, but it works flawlessly, which I think is more important. The POSIX version isn't bad, if that's the only think you need to support.
Absolute to Relative File Path in Java
This question was asked before here
Here is the answer just in case
String path = "/var/data/stuff/xyz.dat";
String base = "/var/data";
String relative = new File(base).toURI().relativize(new File(path).toURI()).getPath();
// relative == "stuff/xyz.dat"
Converting Relative Paths to Absolute Paths
If I get your problem right, you could do something like this:
File a = new File("/some/abs/path");
File parentFolder = new File(a.getParent());
File b = new File(parentFolder, "../some/relative/path");
String absolute = b.getCanonicalPath(); // may throw IOException
How to find relative path given two absolute paths?
I answered a similar question here: Resolving a relative path without referencing the current directory on Windows.
There is no standard function for this. There is a function in vi-like-emacs for this purpose. A quick check of apropos relative
shows me few other programs which likely implement this: revpath for example).
It could be done as a string-manipulation (no need to compute working directories):
- start by finding the longest common prefix which ends with a path-separator.
- if there is no common prefix, you are done
- strip the common prefix from (a copy of...) the current and target strings
- replace each directory-name in the current string with ".."
- add that (with a path-separator) in front of the target string
- return that combined string
The "done" in the second step presumes that you want to use a relative path to shorten the result. On the other hand, you might want to use a relative pathname regardless of the length. In that case, just skip the step (the result will be longer, but relative).
Related Topics
If Profiler Is Not the Answer, What Other Choices Do We Have
Java Regex Meta Character (.) and Ordinary Dot
Resize an Array While Keeping Current Elements in Java
How to Make the Division of 2 Ints Produce a Float Instead of Another Int
Why Does Runtime.Exec(String) Work for Some But Not All Commands
How to Write a Custom JSON Deserializer for Gson
How to Reference Javafx Fxml Files in Resource Folder
How to Play .Wav Files with Java
It Is a Bad Practice to Use Sun's Proprietary Java Classes
What's the Difference Between Fx:Id and Id: in Javafx
Using Prepared Statements to Set Table Name
How to Execute Command with Parameters
Spring Data JPA - Zoneddatetime Format for JSON Serialization
Is the Use of Java's Default Package a Bad Practice
How to Use Optional Parameters in Java