Java con ficheiros de caracteres

De MediaWiki
Ir a la navegación Ir a la búsqueda

Java con Ficheiros de Caracteres

Como indica no primer apartado introductorio os ficheiros de caracteres ou tamén chamados de texto están compostos de caracteres alfanuméricos nun formato estándar (ASCII, UNICODE etc...).

Lectura

Para ler caracteres necesitamos a clase FileReader, que se obtén a partir dun obxecto File (apartado primeiro). A clase FileReader proporcionanos diversos métodos de lectura:

int read(): lee un carácter e o devolve. int read(char [] buf): lee ata buf.lenght caracteres de datos dunha matriz de caracteres (buf). Os caracteres lidos do ficheiro vanse almacenando no buf. int read(char[] buf, int desplazamento, int n): lee ata n caracteres de datos da matriz buf, comezando por buf[desplazamento] e devolve o número lido de caracteres.

Estes métodos devolven -1 se chegou o final do ficheiro. Exemplo →LerCaracteres.java

Todo estes métodos de lectura son de caracter a caracter ou agregando un desprazamento (int a int), pero … é a maneira máis práctica? Non, hai outras:


Usando BufferedReader: Forma máis cómoda de facer lectura de ficheiro de liña a liña. A clase BufferedReader ten un método que é readLine() . Este método devolve unha liña completa en String, ata o final do ficheiro que devolve null. Usando esta clase temos opcións de máis alto nivel de abstración, que facilitan a vida ó programador. Para crear un obxecto BufferedReader hai que crealo a partires de FileReader: File doc = new File("C:\\Drive\\Learn.txt");

BufferedReader obj = new BufferedReader(new FileReader(doc));


Exemplo → LerLineas.java

Usando a clase Scanner: Esta clase permitenos ler ficheiros dunha maneira moi práctica (ademáis do seu uso moi común de recoller datos do teclado). O que hai que ter en conta é que necesitamos un obxecto tipo File para o constructor de Scanner. Existen outras posibilidades como crear un obxecto Scanner con InputStream. Quedamonos coa primeira forma pero coma sempre en programación… hai múltiples opcións! File doc = new File(path);

       Scanner obj = new Scanner(doc);

A clase Scanner ten dous métodos clave: boolean hasNext(): que devolve verdadeiro se non chegau o final do ficheiro, falso en caso contrario. String hasNextLine(): obtemos a liña actual do ficheiro en cadea alfanumérica.

Exemplo → LerLineasScanner.java

Escritura

En Java unha das opción que nos permite escribir nun ficheiro é coa clase FileWriter, que nos proporciona unha serie de métodos:

  • void write(int c): escribe un carácter.
  • void write(char[] buf): escribe un array de caracteres.
  • void write(char[] buf, int desplazamento, int n): escribe n caracteres de datos da matriz buf e comezando por buf[desplazamento].
  • void write(String str): escribe unha cadea de caracteres.
  • append(char c): engade un carácter a un ficheiro.

Para crear obxectos tipo FileWriter é necesario ter un obxecto File, como pasa con FileReader: File ficheiro = new File(“fich.txt”); FileWriter fic = new FileWriter(ficheiro);

Ademáis de coñecer os anteriores métodos é necesario ter en conta o seguinte: o obxecto tipo FileWriter por defecto vais sempre sobreescribir o contido. Se o que queremos é engadir debemos poñer no constructor un segundo parámetro a true: FileWriter fic = new FileWriter (ficheiro, true);

Exemplo→ EscribirFileWriter.java

Usando BufferedWriter: Como pasa coa lectura, Java ofrecenos clases para mellorar a eficiencia na escritura é métodos máis sinxelos para escribir liñas. Neste caso o BufferedWriter é unha clase que deriva da clase Write, e que se compon a partir de FileWriter.

Como estades vendo é unha serie de obxectos que “alimentan” o seguinte ata chegar o que precisamos. Na clase BufferedWriter temos os seguintes métodos coma os máis interesantes:

  • void write(String cad): permitenos escribir cadea de alfanuméricos no buffer. Tamén acepta caracteres e arrays.
  • void newLine(): escribe un salto de línea no buffer.

Exemplo → EscribirLineas.java

Usando PrintWriter: Por último a clase PrintWriter é moi utilizada xa que ten un método chamado println() moi cómodo de utilizar: void println(String cad): escribe a cadea de caracteres no ficheiro cun salto de liña.

Outra das vantaxes desta clase que deriva de Write é que o constructor só necesita a ruta do ficheiro, polo tanto ahorramos obxectos e liñas de código:

Exemplo → EscribirPrintWriter.java

Esta clase tamén ten outros métodos como printf() (saída formateada), print() (escritura sen salto de liña) ou apend() (para agregar contido).

Falta una actividad o dos completillas


Java NIO

Tal como vimos en anteriores apartados a API java.nio.file ofrécenos xeitos máis directos de poder traballar con ficheiros. Neste caso con ficheiros de texto e sempre a partir da clase Files e sus métodos estáticos. Os máis usados son: List<string> readAllLines(Path path, Charset ch): método estático que nos devolve un listado de strings que son as liñas do ficheiro (o charset é opcional). O sinxelo deste método e que péchase e libera o recurso automáticamente ó finalizar a lectura. (existe outra posibilidade con File.lines que amosaremos na sección de lambda) Path write(Path path, Iterable lines, Charset cs, OpenOption... options): esta versión do método escribe liñas ó ficheiro. É necesario un obxecto iterable (cada elemento unha liña), a codificación que se vai usar é o modo de escritura (por defecto se non existe crease, e de existir vaise sobreescribir).

Exemplo → EscribirLerNIO.java