IT이야기

URL을 일반 Windows 파일 이름 Java로 변환

cyworld 2021. 4. 8. 00:19
반응형

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의 경로를 인용 해제하는 것이 아니라 URLDecoderURI의 쿼리 ( param=value&param=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

반응형