2012-09-12 2 views
6

URL에서 파일을 읽어야하는 Java 프로그램이 있습니다 (URL 위치는 IIS 웹 사이트의 가상 디렉토리이며, 아래의 초기 테스트에서 필자는 ' 다른 파일 시스템 위치처럼 취급). 유감스럽게도 읽어야하는 모든 파일의 경로에는 디렉토리 이름 중 하나에 파운드 기호 (#)가 포함되어 있으며이를 변경할 수있는 방법은 없습니다. 이 프로그램은 (시험으로) 경로에 그 파운드 기호가없는 위치를 가리킬 때 아름답게 작동합니다.자바 URI에 파운드 기호 인코딩

프로그램에 전달 된 문자열에서 URL을 작성하여 시작했습니다. 이다

file://serverIPaddress/Documents/\%232012/09/07/16/DOC4671179.DOC 

파운드 기호 : 내 명령 행에이 같은 경로를 통과하는 경우 /Documents/#2012/09/11 같은 파일 경로 (문서 Windows 공유가), 나는 프로그램이 성공적으로 처리 할 얻을 수 수동으로 %23으로 인코딩되고 백 슬래시는 % 23의 %를 이스케이프 처리합니다.

해당 URL 얻기 위해 하나 개의 라인이 있었다 :

URL url = new URL(filePath); // filePath is passed in 

을하지만 프로그램은 같은 인코딩 된 경로를 숟가락으로 떠 먹이는하지 않을, 그래서 나는 파운드를 인코딩하는 방법을 알아 내려고했다 프로그래밍 방식으로 서명하십시오. how to encode URL to avoid special characters in java에있는 좋은 조언에 따라 다중 인수 생성자를 사용하여 URI를 만들었습니다 (프로그램에 전달한 매개 변수를 세 개의 개별 매개 변수로 나누어 변경 내용을 수용했습니다). 그 모습은 다음과 같습니다.

URI uri = new URI(protocol, host, filePath, null); // all values are passed in 

파운드 기호를 올바르게 인코딩했습니다. 내 URI했다 : 그것은 그 백 슬래시의 혜택없이 경로를 잘못 해석이야 아마도 때문에

file://serverIPaddress/Documents/%232012/09/07/16/DOC4671179.DOC 

그러나 %23 앞에 백 슬래시없이

이 프로그램은, Connection refused로 돌아왔다.

그래서 나는 백 슬래시를 직접 추가 할 것이라고 생각했습니다. 동일한 URI를 생성하고 rawPath를 추출한 다음 약간의 문자열 조작으로 % 23 앞에 백 슬래시를 넣습니다. 백 슬래시 및 인코딩 % 모두

file://<serverIPaddress>/Documents/%5C%25232012/09/07/16/DOC4671179.DOC 

: 저에게이 같은 URI를 준, 예상, 그러나

URI uri = new URI(protocol, host, filePath, null); // all values are passed in 
String rawPath = uri.getRawPath(); 
int pctPos = rawPath.indexOf("%"); 
String escaped = new String("\\"); 
String firstPart = rawPath.substring(0,pctPos); 
String secondPart = rawPath.substring(pctPos); 
String newPath = firstPart + escaped + secondPart; 
URI uri2 = new URI(protocol, host, newPath, null); 

: 나는 그 새 문자열을 사용하여 새 URI를 만들었습니다. 의미는 있지만 실행 시간에는 여전히 작동하지 않습니다.

의 URL API는 말한다 :

URL 클래스 자체가 인코딩 또는 RFC2396에 정의 된 이스케이프 메커니즘에 따라 어떤 URL 구성 요소를 를 디코딩하지 않습니다.그것은 가 좋아, 내가 생각 그래서

URL 호출, 대신 두 번째 URI를 생성하기 전에 이스케이프해야하는 필드를 인코딩하는 호출자의 책임이며, 그에서 URL을 만듭니다

/Documents/\%232012/09/07/16/DOC4671179.DOC 

결과 URL이 다시 온다 : 나의 새로운 경로가 좋은 모습에도 불구하고,

URI uri = new URI(protocol, host, filePath, null); // all values are passed in 
String rawPath = uri.getRawPath(); 
int pctPos = rawPath.indexOf("%"); 
String escaped = new String("\\"); 
String firstPart = rawPath.substring(0,pctPos); 
String secondPart = rawPath.substring(pctPos); 
String newPath = firstPart + escaped + secondPart; 
URL url = new URL(protocol + "://" + host + newPath); 

하지만 그 접근 방식 : 새로운 캐릭터 나는 마지막 시도에서 발생 :

file://serverIPAddress/Documents//%232012/09/07/16/DOC4671179.DOC 

백 슬래시 대신 % 23 앞에 추가 슬래시가 있습니다.

그리고 아이디어가 부족합니다.

  • 마지막 접근 방식의 백 슬래시가 URL에서 슬래시가되는 이유는 무엇입니까?

  • 필요한 URI/URL을 얻으려면 어떻게해야합니까?

  • 어쩌면 질문해야합니다 : % 23이 합법적 인 URI 또는 ​​URL의 일부인 경우 프로그램에서 % 23의 %이 (가) 이스케이프되어야하는 이유는 무엇입니까? 그것에 대해 대신?

+0

"연결이 거부되었습니다"라는 메시지를 전달하는 URL은 무엇입니까? – nneonneo

+0

관련 ServerFault 관련 질문에 대한 정보 : http://serverfault.com/q/257680 – barrowc

+0

nneonneo - 귀하의 질문을 이해하고 있는지 잘 모르겠습니다. 프로그램은 URL에 대한 연결을 열고 InputStream, InputStreamReader, BufferedReader를 차례로 읽은 다음 파일에서 읽는 중입니다. InputStream을 얻으려고 할 때 연결 거부 오류가 발생합니다. URLConnection urlConn = url.openConnection(); urlConn.setDoInput (true); InputStream is = urlConn.getInputStream(); InputStreamReader isr = 새로운 InputStreamReader (있는); br = new BufferedReader (isr); – user1664369

답변

0

왜 "\"가 필요한지 잘 모릅니다. 그것은 서버 코드에 따라 다릅니다. 실제로 "\"는 URL에서 유효한 문자가 아니므로 % 5C

URI 클래스로 인코딩해야합니다. 파일 URL에 대해 "\"를 "/"로 자동 변경합니다.

대신을 시도해보십시오

String filePath = "/Documents/#2012/09/11"; 
    filePath = filePath.replace("#", "\\#"); 
    URI uri = new URI("file", "serverAddress", filePath, null); 

은 "#"을 "% 5C % 23"으로 변경됩니다. 그것이 효과가 있는지보십시오.

+0

제안 해 주셔서 감사합니다. 예상대로'replace'는 URI'file : // serverAddress/Documents/% 5C % 232012/09/11/filename'을 제공하지만 그 URI는 InputStream을 얻으려고 할 때 "IOException : connection refused"오류를 낳습니다 (URI에서 URL을 생성 한 후 URL에 대한 연결을 여는 등). – user1664369

+0

새 URL ("file : //"+ serverAddress + filePath.replace ("#", "\\ % 23")' – irreputable

+0

좋은 생각이 있습니다. 그러나 URL은'file : // 172.28.60.68/Documents // % 232012/09/11/DOC4671179.DOC' - 요청 된 백 슬래시 대신 슬래시가 사용됩니다. 백 슬래시를 좋아하지 않는 클래스에 대해 뭔가가 있습니다. 어쩌면 그 문자열 생성자에서 UNC 경로가 작동 할 것입니다.나는 생산 문제로 쫓겨나고있다. 그러나 내가 잠시 후에 그것을 시험 할 것이다. – user1664369

관련 문제