2011-05-28 12 views
45

¿Hay una manera de convertir esto:URL Convertir a nombre de archivo de las ventanas de Java normal

/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/myJar.jar 

en esto ?:

C:\Users\David\Dropbox\My Programs\Java\Test\bin\myJar.jar 

estoy usando el siguiente código, que devolverá la ruta completa el archivo .JAR o el directorio/bin.

fullPath = new String(MainInterface.class.getProtectionDomain() 
      .getCodeSource().getLocation().getPath()); 

El problema es getLocation(), devuelve un URL y necesito un nombre de archivo de las ventanas normales. He intentado añadir lo siguiente después getLocation():

toString() y toExternalForm() tanto la rentabilidad:

file:/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/ 

getPath() devuelve:

/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/ 

Nota del %20 que debe ser convertido en el espacio.

¿Existe una forma rápida y fácil de hacerlo?

+0

Bueno, traté de usar Buscar y reemplazar para los espacios en blanco y eliminar el primer carácter, pero realmente no me gusta. Es por eso que pregunté aquí, tal vez alguien sabe de alguna forma de convertirlo de una manera menos propensa a errores y más eficiente. – David

+0

También se agradecen todas las alternativas para obtener el nombre completo del archivo jar. – David

+0

@ David ¿Quiere decir String WinPath = System.getenv ("USERPROFILE"); WinPath = WinPath.replace ("\\", "\\\\"); WinPath + = "\\\\ Desktop \\\\ SalesReports \\\\"; – mKorbel

Respuesta

61

La recomendación actual (con JDK 1.7+) es convertir URL → URI → Ruta. Entonces, para convertir una URL en archivo, diría Paths.get(url.toURI()).toFile(). Si aún no puede usar JDK 1.7, recomendaría new File(URI.getSchemeSpecificPart()).

Convertir archivo → URI: Primero le mostraré algunos ejemplos de los URI que probablemente obtendrá en Java.

      -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 

Algunas observaciones sobre estos URI:

  • Las especificaciones de URI son RFC 1738: URL, reemplazado por RFC 2396: URI, reemplazado por RFC 3986: URI. (El WHATWG también tiene un URI spec, pero no especifica cómo se deben interpretar los URI de los archivos.) Todos los caracteres reservados en la ruta se citan en porcentajes, y los caracteres no ascii en una URI se citan en porcentajes cuando se llama a URI.toASCIIString().
  • File.toURI() es peor que Path.toUri() porque File.toURI() returns an unusual non-RFC 1738 URI (da archivo:/en lugar de file: ///) y no formatea URI para rutas UNC según Microsoft’s preferred format. Ninguno de estos UNC URI funciona en Firefox (Firefox requiere archivo: /////).
  • La ruta es más estricta que File; no puede construir una ruta inválida desde “\.\” prefix. "Estos prefijos no se usan como parte de la ruta en sí", pero se pueden pasar a las API de Win32.

conversión de URI → archivo: Probemos la conversión de los ejemplos anteriores de archivos:

      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 

De nuevo, usando Paths.get(URI) se prefiere a new File(URI), porque Path es capaz de manejar la UNC URI y rechazar caminos válidos con el prefijo \? \ Pero si no puede usar Java 1.7, diga new File(URI.getSchemeSpecificPart()) en su lugar.

Por cierto, haga no use URLDecoder para decodificar una URL de archivo. Para archivos que contengan "+" como "archivo: /// C: /main.c++", URLDecoder lo convertirá en "C: \ main.c    "! URLDecoder es solo para analizar presentaciones de formulario HTML application/x-www-form-urlencoded dentro de la consulta de URI (param=value&param=value), no para desmarcar la ruta de acceso de un URI.

2014-09: editado para agregar ejemplos.

+1

Esta debería ser la respuesta aceptada, ¡gracias! – Khanser

+3

Por supuesto, todo esto arroja una maldita excepción URISyntaxException. – sproketboy

+0

Paths.get() usa el sistema de archivos predeterminado así que si lo usa no puede probar su código con un sistema de archivos en memoria – opticyclic

14
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 
+0

esta respuesta es peligrosa. desplácese hacia abajo a la respuesta de @ yonran – kritzikratzi

+1

quiere decir scroll up –

2

El código siguiente es lo que necesita:

String path = URLDecoder.decode("/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/", "UTF-8"); 
System.out.println(new File(path).getPath()); 
+2

getAbsolutePath() también funciona, y nunca arrojará una IOException .. – laher

+0

'decode (string)' está en desuso. Debes especificar la codificación. – Bozho

+0

Gracias. Esto con .getAbsolutePath() es perfecto. – David

2

Las respuestas actuales parece sospechoso para mí.

java.net.URL.getFile 

convierte una dirección de fichero como este

java.net.URL = file:/C:/some/resource.txt 

en este

java.lang.String = /C:/some/resource.txt 

esta manera puede utilizar este constructor

new File(url.getFile) 

para darle la ruta de Windows

java.io.File = C:\some\resource.txt 
+3

Esto es incorrecto. No resuelve la representación incorrecta (% 20) de espacios. Supongo que los que votan son como el autor de la respuesta; no leyó la pregunta. –

2

Como se mencionó, getLocation() devuelve una URL. Archivo puede convertir fácilmente una URI a un recorrido por lo que para mí la forma más simple es sólo tiene que utilizar:

File fullPath = new File(MainInterface.class.getProtectionDomain(). 
    getCodeSource().getLocation().toURI()); 

Por supuesto, si usted realmente necesita de cuerdas, basta con modificar para:

String fullPath = new File(MainInterface.class.getProtectionDomain(). 
    getCodeSource().getLocation().toURI()).toString(); 

No es necesario URLDecoder en absoluto.

+0

Esto es mucho más simple que las otras respuestas y en realidad funcionó para mí. – user1062589

2

Hola personas confundidas del futuro. Hay un matiz en la configuración de la ruta de archivo aquí. La ruta que está configurando para TESSDATA_PREFIX se usa internamente mediante el programa tesseract de C++, , no mediante el contenedor java. Esto significa que si está usando Windows necesitará reemplazar la barra diagonal y reemplazar todas las barras diagonales con barras diagonales inversas. Una solución muy hacky se ve así:

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("/", "\\\\"); 
} 
Cuestiones relacionadas