2011-11-30 28 views
12

Tengo poco conocimiento de Java. Necesito construir una representación de cadena de un URI desde FilePath(String) en Windows. A veces el inputFilePath que recibo es: file:/C:/a.txt y en ocasiones es: C:/a.txt. En este momento, lo que estoy haciendo es:Java: Obtener URI desde FilePath

new File(inputFilePath).toURI().toURL().toExternalForm() 

lo anterior funciona bien para caminos, los cuales no tienen el prefijo file:/, pero por caminos prefijado con file:/, la. El método toURI lo está convirtiendo en un URI no válido, agregando el valor del directorio actual y, por lo tanto, la ruta deja de ser válida.

Por favor, ayúdenme sugiriendo una forma correcta de obtener el URI adecuado para ambos tipos de rutas.

+1

¿Sería suficiente simplemente eliminar 'file: /' del comienzo de la cadena si está presente? ¿O podría haber otros prefijos válidos? – Thomas

Respuesta

11

Estos son los URI de archivo válido:

file:/C:/a.txt   <- On Windows 
file:///C:/a.txt   <- On Windows 
file:///home/user/a.txt <- On Linux 

por lo que necesitará para eliminar o file:/file:/// para Windows y para Linux file://.

1

El argumento para new File(String) es una ruta, no un URI. La parte de su publicación después de 'pero' es, por lo tanto, un uso no válido de la API.

+0

Entonces, ¿qué debo hacer para convertir un URI en ruta? Esencialmente, para obtener un camino que no está prefijado con "archivo:" – HarshG

+0

@ user1073005 'nuevo URI (uri) .getPath()', pero esta es una pregunta nueva, ¿no es así? Su pregunta anterior es sobre cómo 'construir una representación de cadena de un URI'. – EJP

+0

Disculpe la confusión ... – HarshG

0
class TestPath { 

    public static void main(String[] args) { 
     String brokenPath = "file:/C:/a.txt"; 

     System.out.println(brokenPath); 

     if (brokenPath.startsWith("file:/")) { 
      brokenPath = brokenPath.substring(6,brokenPath.length()); 
     } 
     System.out.println(brokenPath); 
    } 
} 

Da salida:

file:/C:/a.txt 
C:/a.txt 
Press any key to continue . . . 
+0

Sugiero usar Apache Commons ''StringUtils.removeStart (...)': 'brokenPath = StringUtils.removeStart (brokenPath," file:/")'. – Thomas

4

De SAXLocalNameCount.java de https://jaxp.java.net:

/** 
* Convert from a filename to a file URL. 
*/ 
private static String convertToFileURL (String filename) 
{ 
    // On JDK 1.2 and later, simplify this to: 
    // "path = file.toURL().toString()". 
    String path = new File (filename).getAbsolutePath(); 
    if (File.separatorChar != '/') 
    { 
     path = path.replace (File.separatorChar, '/'); 
    } 
    if (!path.startsWith ("/")) 
    { 
     path = "/" + path; 
    } 
    String retVal = "file:" + path; 

    return retVal; 
} 
+0

Increíble, funciona como un encanto! – Andrei

+3

desde JavaSE7 hace que una línea ... \t \t 'java.nio.file.FileSystems.getDefault(). GetPath (xmlFileAsString) .toAbsolutePath(). Touri()' \t \t devoluciones por ejemplo. '" file: /// C: /develop/doku/projects/Documentry/THB/src/docbkx/Systemvoraussetzungen.xml "' – udoline

3

sólo tiene que utilizar Normalize();

Ejemplo:

path = Paths.get("/", input).normalize(); 

esta línea se normalizar todos sus caminos.

Cuestiones relacionadas