## Más Métodos Accesores

### Para la Clase String

> Además de los accesores length() y charAt() que hemos visto en la página anterior, la clase String proporciona dos accesores que devuelven la posición dentro de una cadena de un carácter específico: indexOf() y lastIndexOf(). El método indexOf() busca empezando desde el principio de la cadena y lastIndexOf() busca empezando desde el final.

> Los métodos indexOf() y lastIndexOf() se utilizan frecuentemente con substring(), que devuelve una subcadena de una cadena. La siguiente clase ilustra el uso de lastIndexOf() y substring() para aislar diferentes partes de un nombre de fichero.
> Nota: Estos métodos no dan ningún error de chequeo y asumen que el argumento contiene un path completo con nombres de directorios y un nombre de fichero con extensión. Si estos métodos se utilizaran en algún programa deberían comprobar que los argumentos estuvieran construidos de forma apropiada.

>     class NombreFichero {
>         String path;
>         char separador;

>         NombreFichero(String str, char sep) {
>             path = str;
>             separador = sep;
>         }

>         String extension() {
>             int punto = path.lastIndexOf('.');
>             return path.substring(punto + 1);
>         }

>         String NombreFichero() {
>             int punto = path.lastIndexOf('.');
>             int sep = path.lastIndexOf(separador);
>             return path.substring(sep + 1, punto);
>         }

>         String path() {
>             int sep = path.lastIndexOf(separador);
>             return path.substring(0, sep);
>         }
>     }

Aquí hay un pequeño programa que construye un objeto NombreFichero y llama a todos sus métodos:

    class NombreFicheroTest {
        public static void main(String[] args) {
            NombreFichero miHomePage = new NombreFichero("/home/index.html", '/');
            System.out.println("Extension = " + miHomePage.extension());
            System.out.println("Nombre de Fichero = " + miHomePage.NombreFichero());
            System.out.println("Path = " + miHomePage.path());
        }
    }

Aquí tienes la salida del programa:

    Extension = html
    NombreFichero = index
    Path = /home

El método extension() utiliza lastIndexOf() para localizar la última aparición de un punto ('.') en el nombre del fichero. Luego substring() utiliza el valor devuelto por lastIndexOf() para extraer la extensión del fichero--esto es, una subcadena desde el punto ('.') hasta el final de la cadena. Este código asume que el nombre del fichero tiene realmente un puno ('.'), si no lo tiene lastIndexOf() devuelve -1, y el método substring() lanzará una StringIndexOutOfBoundsException.

Observa, también que extension() utiliza dot + 1 como el argumento para substring(). Si el punto es el último carácter de la cadena, dot + 1 es igual a la longitud de la cadena que es uno más que la longitud del texto de la cadena (porque los indices empiezan en 0). Sin embargo, substring() accepta un índice igual (pero no mayor) que la longitud de la cadena y lo interpreta como "el final de la cadena".

Intenta esto: Inspeccione los otros métodos utilizados en la clase NombreFichero y observa cómo los métodos lastIndexOf() y substring() trabajan juntos para aislar diferentes partes de un nombre de fichero.

Mientras los méodos del ejemplo anterior sólo utilizan una versión del método lastIndexOf(), la clase String realmente soporta cuatro diferentes versiones de los métodos indexOf() y lastIndexOf(). Las cuatro versiones trabajan de la siguiente forma:

indexOf(int character)
lastIndexOf(int character)
  Devuelve el índice de la primera (o última) ocurrencia del carácter especificado.

indexOf(int character, int from)
lastIndexOf(int character, int from)
  Devuelve el índice de la primera (o última) ocurrencia del carácter escpecificado desde el índice especificado.

indexOf(String string)
lastIndexOf(String string)
  Devuelve el índice de la primera (o última) ocurrencia de la Cadena especificada.

indexOf(String string, int from)
lastIndexOf(String string, int from)
  Devuelve el índice de la primera (o última) ocurrencia de la cadena escpecificada desde el índice especificado.

### Para la Clase StringBuffer

> Al igual que String, StringBuffer porporciona los métodos accesores length() y charAt(). Además de estos dos, accesores, StringBuffer también tiene un método llamado capacity(). Este método es diferente de length() en que devuelve la cantidad de espacio asignado actualmente para el StringBuffer en vez de la cantidad de espacio utilizado. Por ejemplo, la capacidad del StringBuffer de reverseIt() no cambia nunca, aunque la longitud del StringBuffer se incremente en cada vuelta del bucle:

>     class ReverseString {
>         public static String reverseIt(String source) {
>             int i, len = source.length();
>             StringBuffer dest = new StringBuffer(len);

>             for (i = (len - 1); i >= 0; i--) {
>                 dest.append(source.charAt(i));
>             }
>             return dest.toString();
>         }
>     }

Ozito