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.


16 dic 2014

Algoritmos clásicos de ordenación en Java

 

Ordenación de vectores mediante algoritmos

Ordenación por intercambio

Ordenación por selección

Ordenación por el método de la burbuja




Ordenación de vectores mediante algoritmos

Ordenación por intercambio

Hace sucesivas pasadas, comprobando valores consecutivos. Si uno no es menor que el otro, se intercambian, con lo que se va ordenando parcialmente.  Se termina cuando en una pasada no se realiza ningún intercambio.

Inter= true;
while  (inter == true) { // mientras haya habido intercambio
            inter= false;
            for (i=0; i <= n-2; i++) {
                        if (t[i] > t[i+1]){
                                   aux= t[i];
                                   t[i] = t[i+1];
                                    t[i+1] = aux;
                                   inter= true;
                                   }
                        }
            }

 

Ordenación por selección

Se busca el mínimo, se intercambia con el primer elemento. Se repite el proceso con el resto de valores desordenados,  ubicando el segundo valor mínimo como el segundo de los ordenados, hasta que no existan valore desordenados.

for (k=0; k <= n-2; k++) { // buscamos el mínimo entre k y n
            indMin = k; //se toma el primero
            for (i=k           +1; i<=n-1; i++) {
                        if (t[i] < t[indMin]){
                                   indMin= i;        //nuevo mínimo
                                   }
            }
            aux = t[indMin];
            t[indMin] = t[k];
            t[k]= aux;
}

 

Ordenación por el método de la burbuja

Se trata de una ordenación por intercambio mejorada, ya que en cada iteración nos queda ordenado el último elemento, con lo que ya no es necesario llegar a ese elemento sino hasta el anterior.


for (i=0; i <= n-2; i++) {
            for (j=0; j <=  n-2 –i ; j++) {
                        if (t[j] > t[j+1]){
                                   aux = t[j];
                                   t[j] = t[j+1];
                                   t[j+1]= aux;
                                   }
            }
}