URL을 일반 Windows 파일 이름 Java로 변환
이것을 변환하는 방법이 있습니까?
/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/myJar.jar
이것으로? :
C:\Users\David\Dropbox\My Programs\Java\Test\bin\myJar.jar
.JAR 아카이브 또는 / bin 디렉토리의 전체 경로를 반환하는 다음 코드를 사용하고 있습니다.
fullPath = new String(MainInterface.class.getProtectionDomain()
.getCodeSource().getLocation().getPath());
문제는 getLocation()
a를 반환 URL
하고 일반 Windows 파일 이름이 필요하다는 것입니다. 나는 후에 다음을 추가하려고 시도했습니다 getLocation()
.
toString()
그리고 toExternalForm()
모두 반환 :
file:/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/
getPath()
보고:
/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/
%20
어느 것이 공간으로 변환되어야하는지 주목하십시오 .
이 작업을 수행하는 빠르고 쉬운 방법이 있습니까?
현재 권장 사항 (JDK 1.7+ 포함)은 URL → URI → 경로를 변환하는 것입니다. 따라서 URL을 파일로 변환하려면 Paths.get(url.toURI()).toFile()
. 아직 JDK 1.7을 사용할 수 없다면 new File(URI.getSchemeSpecificPart())
.
파일 변환 → URI : 먼저 Java에서 얻을 수있는 URI의 몇 가지 예를 보여 드리겠습니다.
-classpath URLClassLoader File.toURI() Path.toUri()
C:\Program Files file:/C:/Program%20Files/ file:/C:/Program%20Files/ file:///C:/Program%20Files/
C:\main.c++ file:/C:/main.c++ file:/C:/main.c++ file:///C:/main.c++
\\VBOXSVR\Downloads file://VBOXSVR/Downloads/ file:////VBOXSVR/Downloads/ file://VBOXSVR/Downloads/
C:\Résume.txt file:/C:/R%c3%a9sume.txt file:/C:/Résume.txt file:///C:/Résume.txt
\\?\C:\Windows (non-path) file://%3f/C:/Windows/ file:////%3F/C:/Windows/ InvalidPathException
이러한 URI에 대한 몇 가지 관찰 사항 :
- URI 사양은 RFC 1738 : URL , RFC 2396 : URI 로 대체되고 RFC 3986 : URI로 대체됩니다 . (WHATWG에도 URI 사양 이 있지만 파일 URI를 해석하는 방법을 지정하지 않습니다.) 경로 내 예약 된 문자는 퍼센트로 인용되고 URI의 비 ASCII 문자는 URI를 호출 할 때 퍼센트로 인용됩니다. toASCIIString ().
- File.toURI ()는 비 RFC 1738 URI (file : /// 대신 file : / 제공 )를 반환하고 다음에 따라 UNC 경로에 대한 URI 형식을 지정하지 않기 때문에 File.toURI () 는 Path.toUri ()보다 나쁩니다 . Microsoft가 선호하는 형식 . 그러나 이러한 UNC URI는 Firefox에서 작동하지 않습니다 (Firefox에는 file : ///// 필요).
- 경로는 파일보다 더 엄격합니다. "\. \"접두어 에서 잘못된 경로를 구성 할 수 없습니다 . "이러한 접두사는 경로 자체의 일부로 사용되지 않지만"Win32 API에 전달할 수 있습니다.
URI → 파일 변환 : 이전 예제를 파일로 변환 해 보겠습니다.
new File(URI) Paths.get(URI) new File(URI.getSchemeSpecificPart())
file:///C:/Program%20Files C:\Program Files C:\Program Files C:\Program Files
file:/C:/Program%20Files C:\Program Files C:\Program Files C:\Program Files
file:///C:/main.c++ C:\main.c++ C:\main.c++ C:\main.c++
file://VBOXSVR/Downloads/ IllegalArgumentException \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file:////VBOXSVR/Downloads/ \\VBOXSVR\Downloads \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file://///VBOXSVR/Downloads \\VBOXSVR\Downloads \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file://%3f/C:/Windows/ IllegalArgumentException IllegalArgumentException \\?\C:\Windows
file:////%3F/C:/Windows/ \\?\C:\Windows InvalidPathException \\?\C:\Windows
다시 말하지만 Path는 UNC URI를 처리하고 \? \ 접두사가있는 잘못된 경로를 거부 할 수 있으므로를 사용하는 Paths.get(URI)
것이 좋습니다 new File(URI)
. 그러나 Java 1.7을 사용할 수 없다면 new File(URI.getSchemeSpecificPart())
대신 말하십시오 .
그런데 파일 URL을 디코딩하는 데 사용 하지 마십시오URLDecoder
. "file : /// C : /main.c++"와 같이 "+"가 포함 된 파일의 URLDecoder
경우 "C : \ main.c"로 변환됩니다! URI의 경로를 인용 해제하는 것이 아니라 URLDecoder
URI의 쿼리 ( param=value¶m=value
) 내에서 application / x-www-form-urlencoded HTML 양식 제출을 구문 분석 하기위한 것입니다.
2014-09 : 예제를 추가하기 위해 편집되었습니다.
String path = "/c:/foo%20bar/baz.jpg";
path = URLDecoder.decode(path, "utf-8");
path = new File(path).getPath();
System.out.println(path); // prints: c:\foo bar\baz.jpg
언급했듯이 getLocation ()은 URL을 반환합니다. 파일은 URI를 경로로 쉽게 변환 할 수 있으므로 가장 간단한 방법은 다음을 사용하는 것입니다.
File fullPath = new File(MainInterface.class.getProtectionDomain().
getCodeSource().getLocation().toURI());
물론 String이 정말로 필요한 경우 다음으로 수정하십시오.
String fullPath = new File(MainInterface.class.getProtectionDomain().
getCodeSource().getLocation().toURI()).toString();
URLDecoder가 전혀 필요하지 않습니다.
다음 코드가 필요합니다.
String path = URLDecoder.decode("/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/", "UTF-8");
System.out.println(new File(path).getPath());
현재 답변이 수상 쩍어 보입니다.
java.net.URL.getFile
다음과 같은 파일 URL을 바꿉니다.
java.net.URL = file:/C:/some/resource.txt
이것으로
java.lang.String = /C:/some/resource.txt
이 생성자를 사용할 수 있습니다.
new File(url.getFile)
Windows 경로를 제공하기 위해
java.io.File = C:\some\resource.txt
미래에서 온 혼란스러운 사람들 안녕하세요. 여기에 파일 경로 구성에 뉘앙스가 있습니다. TESSDATA_PREFIX에 대해 설정하는 경로 는 Java 랩퍼가 아닌 C ++ tesseract 프로그램에서 내부적으로 사용됩니다 . 즉, 창을 사용하는 경우 선행 슬래시를 교체하고 다른 모든 슬래시를 백 슬래시로 교체해야합니다. 매우 해키 한 해결 방법은 다음과 같습니다.
URL pathUrl = this.getClass().getResource(TESS_DATA_PATH);
String pathStr = pathUrl.getPath();
// hack to get around windows using \ instead of /
if (SystemUtils.IS_OS_WINDOWS) {
pathStr = pathStr.substring(1);
pathStr = pathStr.replaceAll("/", "\\\\");
}
ReferenceURL : https://stackoverflow.com/questions/6164448/convert-url-to-normal-windows-filename-java
'IT이야기' 카테고리의 다른 글
ASP.NET MVC3의 부분보기에서 ViewBag에 액세스 할 수 없습니다. (0) | 2021.04.08 |
---|---|
DbContext 스레드는 안전할까? (0) | 2021.04.08 |
bash 함수 반환 값을 테스트하는 적절한 방법 (0) | 2021.04.08 |
플래시를 사용하지 않고 선택한 텍스트를 클립 보드에 복사 (0) | 2021.04.06 |
Java에서 예외를 발생시키지 않고 try / catch 블록에서 중단하는 방법 (0) | 2021.04.06 |