Close

How to resolve relative URI in Java?

[Last Updated: Apr 28, 2017]

Java 

This code will resolve the relative base uri e.g. if current base uri is /path1/path2 then ../path3 will be resolved as /path1/path3.

public class RelativeUriExample {

  //e.g. currentUri => p/xyz/abc   targetUri => ../stu =>  p/xyz/stu
  public static String resolveRelativeUris(String currentUri, String targetUri) {
      if(targetUri.startsWith("/")){
          return targetUri;
      }

      String uri = targetUri;

      while (uri.startsWith("../")) {
          int i = currentUri.lastIndexOf("/");
          if(i==-1){
              break;
          }
          currentUri = currentUri.substring(0, i);
          uri = uri.substring(3);
      }

      return currentUri + "/" + uri;
  }

  public static void main(String[] args) {
      resolve("/a/b/c/d", "../../e");
      resolve("a/b/c/d", "../e");
      resolve("a/b/c/d", "e");
      resolve("a/b/c/d", "/e");
      resolve("/a/b/c/d", "/e");

  }
  private static void resolve(String current, String relative){
      String s = resolveRelativeUris(current, relative);
      System.out.printf("current:%s target:%s resolved:%s%n", current, relative, s);
  }
}

Output

current:/a/b/c/d target:../../e resolved:/a/b/e
current:a/b/c/d target:../e resolved:a/b/c/e
current:a/b/c/d target:e resolved:a/b/c/d/e
current:a/b/c/d target:/e resolved:/e
current:/a/b/c/d target:/e resolved:/e

Alternatively, we can use java.net.URL as shown in the following example

public class RelativeUriExample2 {

  public static void main(String[] args) throws MalformedURLException {
      resolve("/a/b/c/d", "../../e");
      resolve("a/b/c/d", "../e");
      resolve("a/b/c/d", "e");
      resolve("a/b/c/d", "/e");
      resolve("/a/b/c/d", "/e");
  }

  private static void resolve(String current, String relative) throws MalformedURLException {
      String s = "http://base" + (current.startsWith("/") ? "" : "/");
      URL base = new URL(s + current + (current.endsWith("/") ? "" : "/"));
      URL r = new URL(base, relative);
      String result = r.toString().substring(s.length());
      System.out.printf("current:%s target:%s resolved:%s%n", current, relative, result);
  }
}

Output

current:/a/b/c/d target:../../e resolved:/a/b/e
current:a/b/c/d target:../e resolved:a/b/c/e
current:a/b/c/d target:e resolved:a/b/c/d/e
current:a/b/c/d target:/e resolved:e
current:/a/b/c/d target:/e resolved:/e

See Also