2012-07-15 8 views
10

Estoy desarrollando una aplicación Scala en Windows, y necesito insertar una ruta a un archivo en una plantilla HTML. Uso Java io y nio para trabajar con archivos y rutas.File.toString de Java o Path.toString con un separador de ruta específico

/* The paths actually come from the environment. */ 
val includesPath = Paths.get("foo\\inc") 
val destinationPath = Paths.get("bar\\dest") 

/* relativeIncludesPath.toString == "..\\foo\\inc", as expected */ 
val relativeIncludesPath = destinationPath.relativize(includesPath) 

El problema es que la salida de relativeIncludesPath.toString contiene barras invertidas \ como separadores - porque la aplicación se ejecuta en Windows - pero ya que el camino se va a insertar en una plantilla HTML, debe contener barras inclinadas en lugar /.

Como no pude encontrar nada como file/path.toStringUsingSeparator('/') en los documentos, actualmente me estoy ayudando con relativeIncludesPath.toString.replace('\\', '/'), lo que me parece bastante poco atractivo.

Pregunta: ¿Realmente no hay mejor manera que usar reemplazar?

También experimenté con Java URI, pero es relativize es incomplete.

+0

Tal vez me esté perdiendo algo. ¿Por qué no puedes relativizar la ruta y luego usar 'toURI()' en lugar de usar 'toString()'? – Gene

+0

Lo intenté, pero luego obtuve un URI absoluto que se ve así: '' file:/C:/root/dir/foo/inc/''. –

+0

Gracias por mencionar 'URI'.No me di cuenta de que podía "resolver", y resulta que es perfecto para mí. –

Respuesta

4

La implementación de Windows de las tiendas de interfaz de ruta el camino internamente como una cadena (al menos en el OpenJDK implementation) y simplemente devuelve esa representación cuando se llama al toString(). Esto significa que no se requiere computación y no hay posibilidad de "configurar" ningún separador de ruta.

Por esta razón, llego a la conclusión de que su solución es actualmente la mejor opción para resolver su problema.

0

Puede obtener la mayoría de las propiedades del sistema en Java. Echar un vistazo a este enlace:

http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

desea que esta:

Key: "file.separator" 
Meaning: Character that separates components of a file path. This is "/" on UNIX and "\" on Windows. 

String sep = System.getProperty("path.separator"); 
+0

Sé que puedo obtener el separador, e incluso puedo configurarlo globalmente si no me equivoco. Sin embargo, estoy buscando una forma de seleccionar un separador específico para una sola operación o un solo objeto File/Path. –

1

Acabo de toparme con este problema. Si tiene una ruta relativa, puede usar el hecho de que Path es un Iterable<Path> de sus elementos, siguiendo un elemento raíz inicial opcional, y luego puede concatenar las piezas usted mismo con barras diagonales. Lamentablemente, el elemento raíz puede contener barras inclinadas, p. en Windows obtienes elementos raíz como c:\ y \\foo\bar\ (para rutas UNC), por lo que parece que no importa lo que aún tengas que reemplazar con barras diagonales. Pero usted podría hacer algo como esto ...

static public String pathToPortableString(Path p) 
{ 
    StringBuilder sb = new StringBuilder(); 
    boolean first = true; 
    Path root = p.getRoot(); 
    if (root != null) 
    { 
     sb.append(root.toString().replace('\\','/')); 
     /* root elements appear to contain their 
     * own ending separator, so we don't set "first" to false 
     */    
    } 
    for (Path element : p) 
    { 
     if (first) 
      first = false; 
     else 
      sb.append("/"); 
     sb.append(element.toString()); 
    } 
    return sb.toString();   
} 

y cuando lo prueba con este código:

static public void doit(String rawpath) 
{ 
    File f = new File(rawpath); 
    Path p = f.toPath(); 
    System.out.println("Path: "+p.toString()); 
    System.out.println("  "+pathToPortableString(p)); 
} 

static public void main(String[] args) { 
    doit("\\\\quux\\foo\\bar\\baz.pdf"); 
    doit("c:\\foo\\bar\\baz.pdf"); 
    doit("\\foo\\bar\\baz.pdf"); 
    doit("foo\\bar\\baz.pdf"); 
    doit("bar\\baz.pdf"); 
    doit("bar\\"); 
    doit("bar"); 
} 

me sale esto:

Path: \\quux\foo\bar\baz.pdf 
     //quux/foo/bar/baz.pdf 
Path: c:\foo\bar\baz.pdf 
     c:/foo/bar/baz.pdf 
Path: \foo\bar\baz.pdf 
     /foo/bar/baz.pdf 
Path: foo\bar\baz.pdf 
     foo/bar/baz.pdf 
Path: bar\baz.pdf 
     bar/baz.pdf 
Path: bar 
     bar 
Path: bar 
     bar 

La sustitución textual de la barra inclinada invertida con barra diagonal es definitivamente más fácil, pero no tengo idea de si rompería algún caso desviado. (¿Puede haber barras invertidas en las rutas de Unix?)

Cuestiones relacionadas