Sacar titulo de un path en JAVA

EtherMaN

Hola, escribo este post porque tengo la siguiente duda en Java:

Dispongo de un string tipo "/home/usuario/archivo.avi" y necesito crear una función para que devuelva "archivo" quitándole la ruta y la extensión. No siempre es avi la extensión ni tampoco es siempre la misma.

Lo que yo habia pensado hacer es recorrer el vector del final hacia el principio y cuando encuentre un . ,borrar todo lo que ha encontrando hasta el momento.

Luego mantener todo hasta que encuentre una /

En C si que se mas o menos hacerlo pero en Java no me sale

¿Sabéis como puedo hacerlo ?

B

A ver, necesitas el nombre con o sin la extensión? En cualquier caso detectas el punto y coges de ahí hasta la primera "/". No?

EDIT: Vale, sin la extensión. Pues detecta la posición del punto y de la última / y ahí cortas, mírate el API de java, que tiene mil funciones para eso.

dagavi

Java es la gloria para todas estas cosas, tiene 1000 funciones que te hacen eso, si no directamente te lo facilitan mucho.

Tienes un montón de métodos que te ayudarían a implementarlo (si es que no hubiera uno que te lo hace directo), como por ejemplo el que te dice en que índice hay un carácter (primera aparición o última), obviamente lo tienes tan fácil como saber la última aparición del "." y de la "/", entre esos índices está "archivo". (suponiendo que todo archivo tiene extensión)

Si miraras la API antes de preguntar directamente esto lo tendrías, para eso va muy bien Eclipse (es el que yo usé y el que conozco), ya que escribes el "." al lado del objeto y ya te aparecen todos los métodos, por lo que solo tienes que intentar buscar en una lista algo que pueda ayudarte, así que ni tan siquiera habría que ir al javadoc, escribirías path. y dándole 1 minuto le sacas el método y como se usa.

PD: Este da el resultado que pides, eso si, el "." (de la extensión) debe de existir (si no lo puedes asegurar, tampoco cuesta nada en absoluto comprobarlo antes con el resultado del latIndexOf)

String path = "/ruta/del/archivo.exe";
String file = path.substring(path.lastIndexOf('/') + 1, path.lastIndexOf('.'));
System.out.println("Path: " + path + " -- File: " + file);

Salida:
Path: /ruta/del/archivo.exe -- File: archivo

PD2: No se como te puede salir en C y no en Java, que fuera al revés porque estás acostumbrado a usar métodos como los anteriores tiene una explicación, pero es que lo que puedas hacer aquí con C lo puedes traducir directamente a Java.

Addys

Como te han comentado existen mogollón de métodos que sirven para separar cadenas.

Una de los que yo he usado para estas cosas es el método split() de un objeto string. Este te corta el string según el delimitador que le pases por parámetro al método split(). Luego con string.split("\").length puedes sacar la longitud del array donde te ha almacenado todos los trozos de string que te ha cortado y llegar hasta el último string del array que contendrá "archivo.avi". Para quitarle la extensión puedes hacerlo de manera similar.

Ya que te han comentado un IDE para java, yo te recomiendo otro que, bajo mi punto de vista, es bastante bueno. Sobre todo para java pues esta programado por programadores java y para programadores java (es el IDE oficial de Sun Microsystems) y aparte es gratuito y de código abierto. Además soporte otros muchos lenguajes que también pueden interesar como php, javascript, soporte mysql ... Te estoy hablando de NetBeans (www..netbeans.org). Yo lo probé y no me desengancho de él xD.

Suerte!

Addys

Ojo #3!

Buscando sobre el tema he leido que el "." en java es como * (cualquier cosa) por lo que ese carácter hay que escaparlo "."

La verdad es que no lo he probado asi que no sé si realmente hay que escaparlo o no pero si te falla no dudes en probar con la contra barra.

Saludos!

Addys

Y buscando más aún (y ya me voy a dormir) mira que cosa más interesante he encontrado:

Si crear una instancia del objeto File mira cuantas cosas puedes sacar de él (además de luego trabajar con flujos I/O con el de manera rápida)

        // U S E _ A B S O L U T E _ N A M E
        System.out.println( "Using absolute name" );
        f = new File( "E:\\genus\\species\\CROCODILE.HTML" );

    // prints E:\genus\species\CROCODILE.HTML
    System.out.println( "toString: " + f.toString() );

    // prints E:\genus\species\CROCODILE.HTML
    System.out.println( "absolutePath: " + f.getAbsolutePath() );

    // prints CROCODILE.HTML
    System.out.println( "name: " + f.getName() );

    // prints E:\genus\species\CROCODILE.HTML
    System.out.println( "path: " + f.getPath() );

    // prints E:\genus\species
    System.out.println( "parent: " + f.getParent() );

    // prints E:\genus\species\crocodile.html
    System.out.println( "canonicalPath: " + f.getCanonicalPath() );

    // R E L A T I V E _ N A M E _ W I T H _ D R I V E
    System.out.println( "Using relative name with drive" );
    f = new File( "e:species\\CROCODILE.HTML" );

    // prints E:\genus\species\CROCODILE.HTML
    System.out.println( "absolutePath: " + f.getAbsolutePath() );

    // prints CROCODILE.HTML
    System.out.println( "name: " + f.getName() );

    // prints e:species
    System.out.println( "parent: " + f.getParent() );

    // prints e:species\CROCODILE.HTML
    System.out.println( "path: " + f.getPath() );

    // prints E:\genus\species\crocodile.html
    System.out.println( "canonicalPath: " + f.getCanonicalPath() );
    }

En concreto el que ati te interesa es el método getname() del objeto File. Éste te da el nombre del archivo, eso si, con su extensión xD luego solo tendrías que hacer:

System.out.println(f.getName().split("\.")[0]);

Y ya tendrías el nombre del archivo sin extensión!

Saludos xD

TBT

#5 no es que haya que escapar el punto en java, sólo hay que hacerlo cuando trabajas con expresiones regulares.

Si tuviese que guarrear con separadores, yo utilizaría File.separator que devuelve el "/" o "\" dependiendo de la máquina donde se ejecute

dagavi

#5 Como dice #7 eso sería en una expresión regular, la función que utilicé lo que utiliza es un carácter ('.') no una expresión regular.

También es buen consejo el de usar el file separator. Si bien el separador '/' sirve tanto para linux como para Windows, al revés no (si alguien le da por poner una ruta con \ en Windows funcionaría pero no en Linux), y ya no se en otros SO, con file separator ese problema desaparece

Usuarios habituales