2012-05-29 4 views
4

두의 URI 상대 경로를 가져옵니다 여기서 작동하지 않습니다./나는이 두 URI를 가지고 자바

고마워!

:

+2

[알려진 버그] (http://bugs.sun.com/view_bug.do?bug_id=6226081)입니다. 나는 당신이 다른 도서관을 찾거나 직접 써야한다고 생각합니다. –

답변

5

Apache URIUtils가 작동해야합니다. 외부 라이브러리를 가져 오지 않으려면 java.net.URI이 처리 할 수없는 경우 (즉, 기본 URI 경로가 자식 URI의 접두어가 아닌 경우) 상대 URI를 올바르게 해결해야하는 간단한 구현 방법이 있습니다 통로). 당신은 당신이 원하는 경우는 일반적인 경우를 처리하는 것을 추가해야합니다 -이베이스와 아이가 같은 방식과 권한을 가지고 있음을 시행하지 않는

public static URI relativize(URI base, URI child) { 
    // Normalize paths to remove . and .. segments 
    base = base.normalize(); 
    child = child.normalize(); 

    // Split paths into segments 
    String[] bParts = base.getPath().split("\\/"); 
    String[] cParts = child.getPath().split("\\/"); 

    // Discard trailing segment of base path 
    if (bParts.length > 0 && !base.getPath().endsWith("/")) { 
    bParts = Arrays.copyOf(bParts, bParts.length - 1); 
    } 

    // Remove common prefix segments 
    int i = 0; 
    while (i < bParts.length && i < cParts.length && bParts[i].equals(cParts[i])) { 
    i++; 
    } 

    // Construct the relative path 
    StringBuilder sb = new StringBuilder(); 
    for (int j = 0; j < (bParts.length - i); j++) { 
    sb.append("../"); 
    } 
    for (int j = i; j < cParts.length; j++) { 
    if (j != i) { 
     sb.append("/"); 
    } 
    sb.append(cParts[j]); 
    } 

    return URI.create(sb.toString()); 
} 

참고. 이것은 모든 경계 케이스에 대해 작동하지 않을 수도 있지만, 그것은 당신에게 반대합니다.

+0

감사합니다.하지만 두 호스트 이름을 비교해야합니다. 'if (! base.getHost(). equalsIgnoreCase (child.getHost())) { \t return child; }' – Heiko

3

난 당신이

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URIUtils.html#resolve%28java.net.URI,%20java.net.URI%29

해결

공공 정적 URI의 해결 (URI 기저 URI, URI 참조)

Resolves a URI reference against a base URI. Work-around for bugs in java.net.URI (e.g.) 

Parameters: 
    baseURI - the base URI 
    reference - the URI reference 
Returns: 
    the resulting URI 

예 아파치 URIUtils를 사용할 수 있다고 생각 http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java

관련 문제