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의 %이 (가) 이스케이프되어야하는 이유는 무엇입니까? 그것에 대해 대신?
"연결이 거부되었습니다"라는 메시지를 전달하는 URL은 무엇입니까? – nneonneo
관련 ServerFault 관련 질문에 대한 정보 : http://serverfault.com/q/257680 – barrowc
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