No es un bug, es una característica no documentada

miércoles, 7 de octubre de 2015

Acceso a datos.Clases File y RandomAccessFile

16:34 Posted by Inazio , No comments

Clase File


No sirve para leer ni para escribir en un archivo sino que permite crear o borrar archivos o directorios, cambiar el nombre de un archivo, leer el nombre del directorio, consultar si un nombre representa un fichero o directorio, listar el contenido de un directorio… independientemente de la plataforma (constante File.separator)

import java.io.File;

String sFichero = "miFichero.txt";
String sDirectorio = "miDirectorio";
String sPath = File.separator + sDirectorio + File.separator + sFichero;
System.out.println(sPath);

/*
\miDirectorio\miFichero.txt
 */

import java.io.File;

String sFichero = "miFichero.txt";
String sDirectorio = "miDirectorio";
String so = System.getProperty("os.name");
String separador = System.getProperty("file.separator");
String sPath = separador + sDirectorio + separador + sFichero;
System.out.println(sPath);
System.out.println(so);

/*
\miDirectorio\miFichero.txt
Windows 7
 */

Constructores

La clase File tiene tres constructores:
è File (String path)
è File (String path, String name)
è File (File dir, String name)

Métodos
El parámetro path indica el camino hacia el directorio donde se encuentra el archivo, y name indica el nombre del archivo.
Los métodos más importantes que describe esta clase son los siguientes:
è String getName() – Nombre
è String getPath() – Camino relativo
è String getAbsolutePath() – Camino absoluto
è boolean exists()
è boolean canWrite() – Si el archivo se puede escribir
è boolean canRead() – Si el archivo se puede leer
è boolean isFile()
è boolean isDirectory()
è boolean isAbsolute() – Si un Path es absoluto
è long lastModified()
è long length() – Longitud en bytes
è boolean mkdir() – Crea el directorio
è boolean mkdirs() – Crea el directorio y los superiores si no existen
è boolean renameTo(File destino)
è boolean delete()
è String[] list
è String[] list(FileFilter filter)

Veamos un ejemplo:

import java.io.*;
import java.util.Date;

public class EjemploClassFile {
     public static void main(String[] args) {
          String directorio;
          if (args.length > 0)
                directorio = args[0];
          else
                directorio = ".";
          File actual = new File(directorio);
          System.out.println("El directorio es: ");
          try{
                System.out.println(actual.getCanonicalPath());
          }
          catch(IOException e){}
         
          System.out.println("Su contenido es:");
          File[] archivos = actual.listFiles();
          // Implemento un for-each
          for (File archivo : archivos){
                if(archivo.isFile()){
                     System.out.println("Nombre: " + archivo.getName());
                     System.out.println("Longitud en caracteres: " + archivo.length());
                     System.out.println("Modificado: " + new Date(archivo.lastModified()));
                     System.out.println("Camino: " + archivo.getPath());
                     System.out.println("Camino absoluto: " + archivo.getAbsolutePath());
                     System.out.println("Se puede escribir: " + archivo.canWrite());
                     System.out.println("Se puede leer: " + archivo.canRead());
                }
                System.out.println();
          }
     }
}

Ejemplo de operaciones con ficheros

import java.io.*;

public class EjemploOperacionesArchivo {
     public static void main(String[] args) {
         
          // Creación de un fichero
          try{
                File file = new File("D:\\Inazio.txt");
                boolean resultado = file.createNewFile();
                if (resultado)
                     System.out.println("Archivo creado");
                else
                     System.out.println("No se puede crear el archivo");
          }
          // Para su posible existencia este manejador de error
          catch(IOException e){
                System.out.println("Se produjo el error " + e.getMessage());
          }
         
          // Borrado de fichero
          try{
                File file = new File("D:\\Inazio.txt");
                boolean resultado = file.delete();
                if (resultado)
                     System.out.println("Archivo borrado");
                else
                     System.out.println("No se pudo borar el archivo");
          }
          catch(Exception e){
                System.out.println("Se produjo el error " + e.getMessage());
          }
     }
}

Filtros de archivos


Un filtro es un objeto de una clase que implemente el interface FilenameFilter, y tiene que redefinir la única función del interfaz denominada accept, que deberá devolver un dato de tipo booleano.

Ejemplo

ARCHIVO EJEMPLOFILTROARCHIVOS.JAVA

import java.io.*;

public class EjemploFiltroArchivos implements FilenameFilter{
    
     // Propiedades
     String extension;
    
     // Constructor
     EjemploFiltroArchivos(String Extension){
          this.extension = extension;
     }
    
     // Métodos
     public boolean accept(File dir, String name){
          return name.endsWith(extension);
     }
}

ARCHIVO CLASEPRUEBAS.JAVA

import java.io.*;

public class ClasePruebas{
    
     public static void main(String[] args) {
          if (args.length !=0){
                File fichero = new File(args[0]);
                if (fichero.isDirectory()){
                     String[] listaArchivos = fichero.list(new EjemploFiltroArchivos(".exe"));
                     for(int i = 0; i < listaArchivos.length; i++)
                          System.out.println(listaArchivos[i]);
                }
          }
     }
}

En el código la he definido de forma que si el nombre del archivo termina con una determinada extensión devuelve true y en caso contrario devuelve false.

La función endsWith() de la clase String realiza esta tarea tal como se ve en la porción de código.

La extensión se le pasa al constructor de la clase Filtro para inicializar el dato extensión.

Si se quiere un listado filtrado, se puede pasar un objeto que implemente FileFilter al método File.listFiles(). Para cada entrada en el directorio, un objeto File es pasado al método accept(). Si accept() retorna false, el archivo no será incluido.

Para C:\Windows devolvería bfsvc.exe, explorer.exe, notepad.exe, regedit.exe, winhlp32.exe, write.exe…

Archivos de acceso directo


La clase RandomAccessFile tiene todas las propiedades de las clases DataInputStream y DataOutputStream; permite abrir un archivo como lectura o como lectura y escritura simultáneamente de cualquier tipo de datos primitivo. Si se utiliza para lectura (modo “r”) dispone de métodos como: readInt(), readLong(), readDouble(), readLine()… Si se utiliza como lectura/escritura (modo “rw”) dispone de métodos como writeInt(), writeLong(), writeDouble(), writeBytes()

Constructores

è RandomAccessFile(File fichero, String modo)
è RandomAccessFile(String fichero, String modo) donde modo = “r” (lectura) o “rw” (lectura – escritura)

Métodos

è void seek(long posicion) – Establece la posición actual del puntero en el byte especificado
è long getFilePointer() – Devuleve la posición actual (en bytes)
è int skipBytes(int desplazamiento) – Mueve el puntero el número de bytes del parámetro.
è long length() – Longitud del fichero en bytes

Ejemplo

import java.io.*;

public class EjemplAccesoAleatorio{
     public static void main(String[] args) {

          char c;
          boolean finArchivo = false;
          RandomAccessFile archivo = null;
         
          try{
                archivo = new RandomAccessFile("D:\\prueba.txt", "rw");
                System.out.println("El tamaño del archivo es: " + archivo.length());
                do{
                     try{
                          c = (char)archivo.readByte();
                          if (c == 'b'){
                               archivo.seek(archivo.getFilePointer()-1);
                               archivo.writeByte(Character.toUpperCase(c));
                          }
                     }
                     catch(EOFException e){
                          finArchivo = true;
                          archivo.close();
                          System.out.println("Todas las b convertidas a mayúsculas");
                     }
                }while(!finArchivo);
          }
          catch(FileNotFoundException e){
                System.out.println("El archivo no existe");
          }
          catch(IOException e){
                System.out.println("Se produjo un error con el archivo");
          }
     }
}


Tamaños de tipos primitivos:


0 comentarios:

Publicar un comentario