6 nov 2015

Lectura/Escritura de ficheros de caracteres en Java

Se utilizan las clases FileReader y FileWriter

Lo primero es crear un ejemplar de la clase pasando al constructor una cadena con el nombre del fichero o un File.

Para la lectura y la escritura se utilizan los métodos read o write, que se encargan de leer o escribir un carácter.

Los caracteres alfanuméricos se pueden tratar en muchos esquemas de codificación, por defecto utilizan UTF-8, pero se puede pasar como argumento a FileReader y FileWriter una Charset determinado (ASCII, UNICODE, ISO-8859-1, etc)

Cuando se terminan las operaciones sobre los datos se cierra el fichero con el método close.

FileReader además proporciona los siguientes métodos, que devuelven el número de caracteres leídos, o -1, si se ha llegado al final del fichero:
int read (),  lee un carácter.
int read (char[] buf), lee caracteres en un array buf.
int read(char[] buf, int despl, int n), lee como máximo n caracteres en el array buf y empezando en buf[despl].

FileWriter además proporciona los siguientes métodos:
void write (int car), escribe un carácter.
void write (char[] buf), escribe un array de caracteres.
void write (char[] buf, int despl, int n), escribe n caracteres en el array buf y empezando en buf[despl].
void write (String st), escribe una cadena de caracteres.
append (char car), añade un carácter al fichero.


Lectura/Escritura en ficheros de caracteres utilizando memoria intermedia (buffered)

Las clases anteriores traducen directamente cada operación de E/S a una llamada al sistema operativo subyacente. Esto puede ser muy ineficiente cuando se procesan grandes volúmenes de información; resulta mucho más rápido leer y escribir siempre en una zona de memoria intermedia, que solo se llena o vacía (mediante llamadas al sistema operativo) cuando es necesario.

Las clases con memoria intermedia para el tratamiento de caracteres son: BufferedReader y BufferedWriter.

El constructor de la clase con memoria intermedia recibe un ejemplar de la clase sin memoria intermedia.

Además nos permiten procesar líneas de texto completas, mediante los métodos readLine().

Ejemplos:
FileReader fr = new FileReader(fichent)
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(fichsal);
BufferedWriter bw = new BufferedWriter(fw);


Lectura/Escritura en ficheros de caracteres haciendo lectura por líneas

Para leer textos por líneas se emplean las clases BufferedReader y PrintWriter. El método de funcionamiento puede ser leer una línea completa, procesarla y escribirla en el archivo de destino.

Hay que tener en cuenta que cada sistema operativo hace uso de marcadores de fin de línea diferentes.

BufferedReader flujoDeEntrada = null;       
PrintWriter flujoDeSalida = null;       
try {           
flujoDeEntrada =  new BufferedReader(new FileReader(libro.txt"));           
flujoDeSalida =  new PrintWriter(new FileWriter("copia_libro.txt"));
String linea;
while ((linea = flujoDeEntrada.readLine()) != null) {
flujoDeSalida.print(linea);
}
}  finally {
if (flujoDeEntrada != null) {
flujoDeEntrada.close();
}
if (flujoDeSalida != null) {
flujoDeSalida.close();

}

5 nov 2015

Lectura/Escritura de ficheros binarios en Java


Se utilizan las clases FileInputStream y FileOutputStream

Lo primero es crear un ejemplar de la clase pasando al constructor una cadena, con el nombre del fichero, o un File.

Para la lectura y la escritura se utilizan los métodos read o write, que se encargan de leer o escribir un byte.

Cuando se terminan las operaciones sobre los datos se cierra el fichero con el método close.

Ejemplo:
FileInputStream in =  new FileInputStream(fichero);
FileOutputStream out = new FileOutputStream("copia_"+fichero);           
int c;           
while ((c = in.read()) != -1) {
out.write(c);
int.close();
out.close();


Lectura/Escritura en ficheros binarios utilizando memoria intermedia (buffered)

Para leer y escribir bytes con memoria intermedia:
FileInputStream fis;
fis = new FileInputStream(“imagen.jpg”)
BufferedInputStream bis= new BufferedInputStream(fis);
FileOutputStream fos;
fos = new FileOutputStream(“copia_imagen.jpg”);
BufferedOutputStream bos = new BufferedOutputStream(fos);

4 nov 2015

Los Streams, tipos y jerarquías en Java

Definición


Los flujos de datos o Streams, son abstracciones que permiten tratar la comunicación de información entre una fuente y un destino. Los flujos actúan como interfaz con el dispositivo o clase asociada:
·         Operación independiente del tipo de datos y del dispositivo, por lo que aporta mayor flexibilidad
·         Diversidad de dispositivos (fichero, pantalla, teclado, red, )
·         Diversidad de formas de comunicación
Modo de acceso: secuencial, aleatorio
Información intercambiada: binaria, caracteres, líneas

Están definidos en el paquete java.io

En Java se accede a la E/S estándar mediante los siguientes atributos estáticos de la clase java.lang.System:
System.in                    implementa la entrada estándar
System.out                  implementa la salida estándar
System.err                  implementa la salida de errores


Tipos de flujos

 Flujos de bytes (8 bits)
Realizan operaciones de entrada y salida de bytes.
Están orientados al tratamiento de datos binarios.
Utilizan las clases abstractas InputStream y OutputStream y sus descendientes.

Flujos de caracteres (16 bits)
Realizan operaciones de entrada y salida de caracteres.
Utilizan las clases abstractas Reader y Writer.
Se utilizan sobre todo para la internacionalización ya que permite manejar caracteres Unicode de 16 bits.

Jerarquía de flujos de bytes






Subclases de InputStream

Clase
Función
ByteArrayInputStream
Utiliza un buffer interno para los bytes leídos del stream
StringBufferInputStream
Obsoleta, se recomienda StringReader.
Los bytes leídos al stream son proporcionados desde una cadena.
FileInput Stream
Obtiene los bytes de entrada desde un fichero del sistema
PipedInputStream
Permite implementar mecanismos de tubería,  para por ejemplo desacoplar la entrada de la salida
FilterInputStream
Toma datos de otro stream transformándolos o añadiéndoles funcionalidad
SequenceInputStream
Permite realizar una concatenación lógica de flujos de entrada

Subclases de OutputStream

Clase
Función
ByteArrayOutputStream
Implementa un flujo de salida en el que los datos se van escribiendo en una matriz de bytes que va creciendo
FileOutputStream
Es un flujo de salida para escribir datos en un fichero o en un descriptor de fichero
PipedOutpudStream
Permite implementar mecanismos de tubería,  junto con PipedInputStream
FilterOutputStream
Permite hacer transformaciones en los datos de salida

Jerarquía de flujo de caracteres



13 oct 2015

Trabajando con rutas (paths) en Java. Utilizando System property y File

La clase System utiliza un objeto de tipo Properties para tener la información relacionada con el entorno de trabajo actual. Esta información incluye el separador de las rutas de los directorios,  el directorio de trabajo del usuario, la versión de Java, etc.

Estas propiedades pueden ser leídas y escritas, mediante métodos get y set. Por ejemplo para obtener el nombre del sistema operativo, tendríamos que pasarle al método get, la cadena “os.name”, de esta forma:
System.getProperty(“os.name”);

La siguiente tabla muestra las posibles claves y su significado:

Clave
Significado
"file.separator"
Carácter separador de las rutas de los ficheros. Por ejemplo "/" en Linux y "\" en Windows.
"java.class.path"
Ruta usada para buscar clases compiladas .class o paquetes .jar.
"java.home"
Directorio de instalación del Java Runtime Environment (JRE)
"java.vendor"
Nombre del distribuidor del JRE
"java.vendor.url"
URL del distribuidor del JRE
"java.version"
Número de versión del JRE
"line.separator"
Secuencia de caracteres usada por el SO como separador de líneas de los ficheros de texto
"os.arch"
Arquitectura del sistema operativo
"os.name"
Nombre del sistema operativo
"os.version"
Versión del sistema operativo
"path.separator"
Carácter utilizado para separar las rutas en java.class.path
"user.dir"
Directorio de trabajo del usuario
"user.home"
Directorio home del usuario
"user.name"
Nombre de la cuenta de usuario

Algunos de estos valores también se pueden obtener mediante File. El separador de rutas se puede obtener con File.pathSeparator (devuelve un String) o File.pathSeparatorChar (devuelve un char). El separador de ficheros se obtiene con File.separator (devuelve String) y con File.separatorChar (devuelve char).

Estas propiedades nos ayudarán a que el código desarrollado pueda ser multiplataforma, aunque no siempre es fácil, ya que por ejemplo no todos los sistemas operativos utilizan el mismo nombre para el escritorio: en unos casos es “Desktop” en otros “Escritorio”. Algo como:

String ruta= System.getProperty("user.home")+File.separator+"Desktop"+File.separator+”fichero.txt”

no siempre sería válido. Habría que verificarlo y mediante comprobaciones del nombre del sistema operativo, determinar con condiciones la ruta.


12 oct 2015

La clase File en Java

Características

Es una clase asociada a las operaciones de gestión de ficheros. Proporciona información sobre los ficheros a nivel de sistema operativo, como nombres, directorios, distintos tipos de rutas, o atributos. Permite realizar operaciones globales sobre ficheros  y directorios, como por ejemplo, borrados o cambios de nombre.

Se dispone de varios constructores para crear objetos de tipo File. Es necesario pasarles el nombre del fichero y el del directorio donde se va a crear.

Creación de objetos File

Constructores:
File (String ruta_y_nombrefichero)
File (String ruta, String nombrefichero)
File (File ruta, String nombrefichero)

Ejemplos:
File fichWin = new File(“C:\direct1\direct2\fichero.txt”);
File fichLinux = new File (“/direct1/direct2/fichero.txt”);

String direct= “C:\direct1\direct2”;

File fichWin2= new File(direct, “fichero2.txt”);
File descrip = new File(direct);
File fichWin3= new File (descrip, “fichero3.txt”);

Principales métodos

getName(), devuelve el nombre del fichero o directorio.
getPath(), devuelve la ruta relativa.
getAbsolutePath(), devuelve la ruta absoluta.
getParent(), devuelve el directorio padre o null.
canRead(),  devuelve cierto si el fichero se puede leer.
canWrite(), devuelve cierto si el fichero se puede escribir.
length(), devuelve el tamaño del fichero en bytes.
createNewFile(), crea un nuevo fichero si no existe.
mkdir(), crea un directorio.
delete(), borra el fichero o directorio.
renameTo(), cambia el nombre con el nuevo argumento.
exists(),  devuelve cierto si el fichero o directorio existe.
isDirectory(), devuelve cierto si el objeto File está asociado a un directorio.
isFile(), devuelve cierto si el objeto File está asociado a un fichero.
list(), devuelve una lista con los nombres de los ficheros o directorios.

Ejemplo de uso:

Import java.io.File
Public class ListarDirectorio{
public static void main(String[] args){
     System.out.println(“ Directorio actual: “);
     File f = new File(“.”);
String[] lista = f.list();
for (String nombre : lista) {
        System.out.println(nombre);
        }
          }
}

Atributos de la clase File

Hay que tener en cuenta los distintos separadores de directorios o carpetas que utilizan los diferentes sistemas operativos, por ejemplo en Linux será “/”, mientras que en Windows es “\”.
También los sistemas operativos difieren en el carácter utilizado para separar rutas, por ejemplo, en variables del sistema.
Para ayudar a las aplicaciones para que puedan intentar ser independientes del sistema operativo, se proporcionan los siguientes atributos de File:

File.pathSeparator (devuelve un String). Separador de rutas.
File.pathSeparatorChar (devuelve un char). Separador de rutas.
File.separator (devuelve String).  Separador de carpetas.

File.separatorChar (devuelve char). Separador de carpetas.

24 mar 2015

Los Working Set en Eclipse. Una forma de organizar los proyectos

Cuando en Eclipse crece el número de proyectos con los que estamos trabajando, puede ser interesante organizarlos mediante los denominados Working Set, que vendrían a ser una especie de directorios o carpetas donde organizarlos.

Antes de agrupar en un Workin Set, hay que crearlo. Por defecto todos los proyecto del explorador están en el primer Workin Set. Para crear uno nuevo Desde el explorador de proyectos de Eclipse, pulsamos en el botón View Menu (triángulo con el vértice hacia abajo)


Nos aparece la siguiente ventana:


Elegimos la opción Select Working Set… y aparece una nueva ventana en la que pulsaremos el botón new:


Elegimos el tipo de Working Set, en este caso Java:


Por último ponemos nombre al Working Set y le añadimos los proyectos que va a contener.


Una vez hecho esto, aparentemente no ha cambiado nada y en el explorador aparecen todos los proyectos, tendremos que desplegar de nuevo el menú del botón View Menu y elegir de nuevo la opción Select Working Set, ahora ya nos aparecerá el Working Set que hemos creado y si lo seleccionamos sólo nos aparecerán los proyectos que hemos metido.