jueves, 6 de diciembre de 2012

Socket Multicast

1.1.1.        ¿Que es un socket multicast?
A veces nos interesa que un ordenador pueda enviar un mensaje por red y que este sea recibido por otros ordenadores simultáneamente. Para ello están las direcciones multicast. Son direcciones en el rango 224.0.0.0 a 239.255.255.255. La 224.0.0.0 está reservada y no puede usarse. Enviando mensajes por estas direcciones, cualquier otro ordenador en la red que las escuche podría leer dicho mensaje, independientemente de cual sea la IP real de ese ordenador. Es decir, si un ordenador quiere enviar un mensaje simultáneamente a varios, puede hacerlo enviando el mensaje a una de estas IPs, los demás ordenadores deben estar a la escucha de dichas IPs para recibir el mensaje.

1.1.2.        Enviar un mensaje Multicast

public class MulticastServer {

     public static void main(String[] args) throws InterruptedException, IOException {
        try {

Construccion de un Servidor TCP/IP


1.1.1.        La clase Servidor TCP/IP
Veamos el código que presentamos en el siguiente ejemplo, donde desarrollamos un   mínimo   servidor   TCP/IP,   para   el   cual   desarrollaremos   después   su contrapartida cliente TCP/IP. La aplicación servidor TCP/IP depende de una clase de comunicaciones proporcionada por Java: ServerSocket. Esta clase realiza la mayor parte del trabajo de crear un servidor.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {

viernes, 26 de octubre de 2012

Implementación en JAVA (Sockets)

1.1.1.        La clase URL
Para comenzar con la programación de sockets, resulta necesario comprender las clases que ofrece Java. En primer lugar, la clase URL contiene constructores y métodos para la manipulación de URL (Universal Resource Locator): un objeto o servicio  en  Internet.  El  protocolo  TCP necesita  dos  tipos de información: la dirección IP y el número de puerto. Vamos a ver como podemos recibir entonces la página Web siguiente:

http://www.yahoo.com

En primer lugar, Yahoo tiene registrado su nombre, permitiendo que se use yahoo.com como su dirección IP, o lo que es lo mismo, cuando indicamos yahoo.com es como si hubiésemos indicado 205.216.146.71, su dirección IP real.

Si queremos obtener la dirección IP real de la red en que estamos corriendo, podemos realizar llamadas a los métodos getLocalHost() y getAddress(). Primero, getLocalHost() nos devuelve un objeto iNetAddress, que si usamos con getAddress() generará un array con los cuatro bytes de la dirección IP, por ejemplo:

InetAddress direccion = InetAddress.getLocalHost();
byte direccionIp[] = direccion.getAddress();

Si la dirección de la máquina en que estamos corriendo es 150.150.112.145, entonces:

direccionIp[0] = 150 direccionIp[1] = 150 direccionIp[2] = 112 direccionIp[3] = 145

Por otro lado, podemos especificar las partes que componen una url y así podríamos construir un objeto de tipo url utilizando los siguientes constructores:

URL (“http","www.yahoo.com","80","index.html”);

o  dejar  que  los  sistemas  utilicen  todos  los  valores  por  defecto  que  tienen definidos, como en:

URL (“http://www.yahoo.com”);

Y en los dos casos obtendríamos la visualización de la página principal de Yahoo en nuestro navegador.

1.1.2.        Arquitectura de comunicaciones
En Java, crear una conexión socket TCP/IP se realiza directamente con el paquete java.net. A continuación mostramos un diagrama de lo que ocurre en el lado del cliente y del servidor:



Networking en JAVA (Utilización de Sockets)

1.1.1.        Introducción a la programación con Sockets
Java proporciona dos formas diferentes de atacar la programación de comunicaciones a través de red, al menos en lo que a la comunicación web concierne. Por un lado están las clases Socket, DatagramSocket y ServerSocket, y por otro lado están las clases URL, URLEncoder y URLConnection.

Los sockets son puntos finales de enlaces de comunicaciones entre procesos. Los procesos los tratan como descriptores, de forma que se pueden intercambiar datos con otros procesos transmitiendo y recibiendo a través de sockets. El tipo de sockets describe la forma en la que se transfiere información a través de ese socket.

1.1.2.        Que son los Stream Sockets (TCP)
Son un servicio orientado a conexión, donde los datos se transfieren sin encuadrarlos en registros o bloques. Si se rompe la conexión entre los procesos, éstos serán informados de tal suceso para que tomen las medidas oportunas.

El  protocolo  de  comunicaciones  con  streams  es  un  protocolo  orientado  a conexión, ya que para establecer una comunicación utilizando el protocolo TCP, hay que establecer en primer lugar una conexión entre un par de sockets. Mientras uno de los sockets atiende peticiones de conexión (servidor), el otro solicita una conexión (cliente). Una vez que los dos sockets estén conectados, se pueden utilizar para transmitir datos en ambas direcciones.

1.1.3.        Que son los Datagram Sockets (UDP)
Son un servicio de transporte sin conexión. Son más eficientes que TCP, pero en su utilización no está garantizada la fiabilidad. Los datos se envían y reciben en paquetes, cuya entrega no está garantizada. Los paquetes pueden ser duplicados, perdidos o llegar en un orden diferente al que se envió.

El protocolo de comunicaciones con datagramas es un protocolo sin conexión, es decir, cada vez que se envíen datagramas es necesario enviar el descriptor del socket local y la dirección del socket que debe recibir el datagrama. Como se puede ver, hay que enviar datos adicionales cada vez que se realice una comunicación, aunque tiene la ventaja de que se pueden indicar direcciones globales y el mismo mensaje llegará a un muchas máquinas a la vez.

Identificación de procesos (Networking)


1.1.1.        Que es una dirección IP
Una dirección IP es un número que identifica de manera lógica y jerárquica a una interfaz de un dispositivo (habitualmente una computadora) dentro de una red que utilice el protocolo IP (Internet Protocol), que corresponde al nivel de red del protocolo TCP/IP. Dicho número no se ha de confundir con la dirección MAC que es un número hexadecimal fijo que es asignado a la tarjeta o dispositivo de red por el fabricante, mientras que la dirección IP se puede cambiar.

Es habitual que un usuario que se conecta desde su hogar a Internet utilice una dirección IP. Esta dirección puede cambiar cada vez que se conecta; y a esta forma de asignación de dirección IP se denomina una dirección IP dinámica (normalmente se abrevia como IP dinámica).

Los sitios de Internet que por su naturaleza necesitan estar permanentemente conectados, generalmente tienen una dirección IP fija (se aplica la misma reducción por IP fija o IP estática), es decir, no cambia con el tiempo. Los servidores de correo, DNS, FTP públicos, y servidores de páginas web necesariamente deben contar con una dirección IP fija o estática, ya que de esta forma se permite su localización en la red.

1.1.2.        Que es un puerto
Un puerto es una dirección numérica a través de la cual se procesa un servicio, es decir, no son puertos físicos semejantes al puerto paralelo para conectar la impresora, sino que son direcciones lógicas proporcionadas por el sistema operativo para poder responder.

Las comunicaciones de información relacionada con Web tienen lugar a través del puerto 80 mediante protocolo TCP. Para emular esto en Java, se utiliza la clase Socket.

Teóricamente hay 65535 puertos disponibles, aunque los puertos del 1 al 1023 están reservados al uso de servicios estándar proporcionados por el sistema, quedando el resto libre para utilización por las aplicaciones de usuario. De no existir los puertos, solamente se podría ofrecer un servicio por máquina. Nótese que el protocolo IP no sabe nada al respecto de los números de puerto.

Introducción a Networking

1.1.1.        Que es Networking
El termino Networking se refiere a la posibilidad de trabajar con diversas aplicaciones ubicadas físicamente en distintas estaciones de trabajo y permitir que se conecten vía una red, para trabajar de manera cooperativa o simplemente enviar y recibir información.

1.1.2.        Que es un socket
Un Socket es una representación abstracta del extremo (endpoint) en un proceso de comunicación. Para que se dé la comunicación en una Red, el proceso de comunicación requiere un Socket a cada extremo Emisor/Receptor y viceversa.



La comunicación con sockets sigue el modelo Cliente/Servidor/Cliente. En la mayoría  de los  casos  un programa  Servidor fundamentalmente  envía  datos, mientras que un programa Cliente recibe esos datos, aunque es raro que un programa exclusivamente reciba o envíe datos. Una distinción confiable se logra si consideramos Cliente al programa que inicia la comunicación y Servidor al programa que espera a que algún otro iniciecomunicación con él.

viernes, 19 de octubre de 2012

Ejemplo de señalización ( wait() y notify() )

En este ejemplo vamos a tener 3 clases: una clase Main, una clase Saludo y una clase Personal (Hilo).

Clase Main:

public class Main {
   
    public static void main(String[] args) {
       
        // Objeto en comun, se encarga del wait y notify
        Saludo s = new Saludo();
       
        /*Instancio los hilos y le paso como parametros:
         *

Ejemplo exclusión mutua (synchronized)

En este ejemplo vamos a tener 3 clases: una clase Main, una clase CuentaBanco y una clase VerificarCuenta (Hilo).

Clase Main:

public class Main {
    public static void main(String[] args) {
       
        VerificarCuenta vc = new VerificarCuenta();
       
        Thread Luis = new Thread(vc, "Luis");
        Thread Manuel = new Thread(vc, "Manuel");
       
        Luis.start();
        Manuel.start();
    }
}

Sincronización (Threads)


La importancia de la sincronización
La programación concurrente puede dar lugar a muchos errores debido a la utilización de recursos compartidos que pueden ser alterados. Las secciones de código potencialmente peligrosas de provocar estos errores se conocen como secciones críticas.

En general los programas concurrentes deben ser correctos totalmente. Este concepto es la suma de dos conceptos distintos de la corrección parcial(o safety) esto es que terminara en algún momento de tiempo finito. En esto programas por lo tanto hay que evitar que varios hilos entren en una sección critica (exclusión mutua o mutex) y que los programas se bloqueen (deadlock).

Planificación de Threads (Prioridades)


Que significa planificación
Un tema fundamental dentro de la programación multihilo es la planificación de los hilos. Este concepto se refiere a la política a seguir de que hilo toma el control del procesador y cuando. Obviamente en el caso de que un hilo este bloqueado esperando una operación de I/O este hilo debería dejar el control del procesador y que este control lo tomara otro hilo que si pudiera hacer uso del tiempo de CPU. ¿Pero que pasa si hay más de un hilo esperando? ¿A cual de ellos le otorgamos el control del procesador?

Prioridades
Para determinar que hilo debe ejecutarse primero, cada hilo posee su propia prioridad: un hilo de prioridad mas alta que se encuentre en el estado LISTO entrara antes en el estado EN EJECUCION que otro de menor prioridad.

El método setPriority()
Para establecer la prioridad de un thread se utiliza el método setPriority() de la siguiente manera:

Estados de un Thread


Estado Nuevo
El Thread ha sido creado pero no inicializado, es decir, no se ha ejecutado todavía el método start(). Se producirá un mensaje de error (IllegalThreadStateException) si se intenta ejecutar cualquier método de la clase Thread distinto de start().

Estado Ejecutable
El Thread puede estar ejecutándose, siempre y cuando se le haya asignado un determinado tiempo de CPU. En la practica puede no estar siendo ejecutado en un instante determinado en beneficio de otro thread.

Estado Bloqueado
El Thread podría estar ejecutándose, pero hay alguna actividad interna suya que lo impide, como por ejemplo una espera producida por una operación de escritura o lectura de datos por teclado (E/S). Si un Thread esta en este estado, no se le asigna tiempo de CPU.

Controlando los Threads (Ciclo de vida)


Que es el ciclo de vida
El ciclo de vida de un Thread representa los estados por los cuales puede pasar un Thread desde que nace hsta que muere. Durante el ciclo de vida de un Thread, este se puede encontrar en diferentes estados. La figura siguiente muestra estos estados y los métodos que provocan el paso de un estado a otro.

Diagrama de ciclo de vida

















- Para ver un diagrama mas detallado del ciclo de vida de un Thread ver la entrada "Estados de un Thread" Ciclo de Vida Extendido -

Método Deprecados (Desaconsejados) - Threads -

El método stop(), que ocasiona el lanzamiento de la excepción ThreadDeath en el thread destino. La excepción se genera sea cual sea el método que está ejecutando el thread. La idea es que la excepción no se capture, de modo que vaya subiendo en la pila de llamadas de el thread destino, hasta llegar al método run(), que tampoco la capturaría, finalizando la ejecución de el Thread. La excepción ThreadDeath es la única que es ignorada por el método uncaughtException(...) de la clase ThreadGroup, de modo que el usuario no recibe ningún mensaje en la salida de error por culpa de dicha excepción.
        ThreadDeath hereda intencionadamente de Error, en lugar de Exception, pues lo que se quiere es que no sea capturada, y como existe el uso generalizado de la construcción:

    try {
       ...
    }
    catch (Exception e) {
       ...
    }


         prefirieron que ThreadDeath no heredara de Exception, a pesar de que no entra dentro de la filosofía de la clase Error.

Manejo de Threads (Metodos)

Los métodos start() y run()
Como habíamos mencionado antes, para poner en marcha este nuevo Thread se debe llamar al método start(), heredado de  la súper-clase Thread, que se encarga de llamar a run(). Es importante no confundir el método start() con el método run(). El método run() contiene el código a ser ejecutado “asincrónicamente” en otro thread, mientras que el método start() es el que crea al Thread y en algún punto hace que ese Thread ejecute lo que esta en run(). Este método devuelve el control inmediatamente. Pero si mezclamos todo y ejecutamos directamente el run(), el código se ejecutara en el Thread actual.

El método start() devuelve el control inmediatamente… mientras tanto, el nuevo Thread inicia su recorrido por el método run(). ¿Hasta cuando? Hasta que termina ese método, cuando sale, termina el Thread.

El método join()
Si un Thread necesita esperar a que otro termine (por ejemplo el Thread padre espera a que termine el hijo) puede usar el método join(). ¿Por que se llama así? Crear un proceso es como una bifurcación, se abren 2 caminos, que uno espere a otro es lo contrario, una unificación.

Creación de Threads

Alternativas de creación
En Java hay dos formas de crear nuevos threads. La primera de ellas consiste en crear una nueva clase que herede de la clase  java.lang.Thread y sobrecargar el método run() de dicha clase. El segundo método consiste en declarar una clase que implemente la interfaz java.lang.Runnable, la cual declarara el método run(); posteriormente se enviara dicho objeto a la clase Thread.

En este caso, se ha creado la clase MiClase, que hereda de Thread y después haremos lo mismo pero implementando Runnable. La principal actividad del thread, es que escriba 10 veces el nombre del thread creado.

Para poner en marcha este nuevo thread se debe llamar la método start(), heredado de la súper-clase Thread, que se encarga de llamar a run().

Introducción a Threads


Que es un Thread (Hilo de Ejecución).
Un concepto fundamental en programación es la idea de manejar más de una tarea a la vez. Muchos problemas de programación requieren que el programa pueda detener lo que este haciendo, tratar con algún otro problema y regresar al proceso principal.

Dentro de un programa, las partes que corren separadamente se llaman hilos (Thread) y el concepto general se llama Multithreading.

Ordinariamente, los hilos son una manera de asignar el tiempo de un solo procesador. Pero si el sistema operativo apoya procesadores múltiples, cada hilo puede asignarse a

jueves, 14 de junio de 2012

Uso de JList y JTable


Para el manejo de datos con JList y JTable debemos hacer uso de modelos. En el caso de las listas vamos a
necesitar hacer uso de la clase DefaultListModel y para las tablas usaremos DefaultTableModel.
Vamos a tener que importar las siguientes librerías:

import javax.swing.DefaultListModel;                   // En caso de JList
import javax.swing.table.DefaultTableModel;       // En caso de JTable

Listas

Primero que nada debemos crear nuestro modelo para luego asignárselo a nuestra lista. Yo recomiendo declararlo como atributo de clase y de forma estática, para que sufra las modificaciones desde cualquier parte del programa.
Su implementación es la siguiente:

lunes, 4 de junio de 2012

JOptionPane


JOptionPane.showOptionDialog()

Tenemos un método JOptionPane.showOptionDialog() que nos muestra la ventana más configurable de todas, en ella debemos definir todos los botones que lleva. De hecho, las demás ventanas disponibles con JOptionPane se construyen a partir de esta. Por ello, al método debemos pasarle muchos parámetros:

■  parentComponent: A partir de este componente, se intentará determinar cual es la ventana que debe hacer de padre del JOptionPane. Se puede pasar null, pero conviene pasar, por ejemplo, el botón desde el cual se lanza la acción que provoca que se visualice el JOptionPane. De esta manera, la ventana de aviso se visualizará sobre el botón y no se podrá ir detrás del mismo si hacemos click en otro sitio.

■  message: El mensaje a mostrar, habitualmente un String, aunque vale cualquier Object cuyo método toString() devuelva algo con sentido.

■  title: El título para la ventana.

  optionType: Un entero indicando qué opciones queremos que tenga la ventana. Los posibles valores son las constantes definidas enJOptionPane: DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION, o OK_CANCEL_OPTION.

  messageType: Un entero para indicar qué tipo de mensaje estamos mostrando. Este tipo servirá para que se determine qué icono mostrar. Los posibles valores son constantes definidas en JOptionPane: ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE, o PLAIN_MESSAGE

  icon: Un icono para mostrar. Si ponemos null, saldrá el icono adecuado según el parámetro messageType.

  options: Un array de objects que determinan las posibles opciones. Si los objetos son componentes visuales, aparecerán tal cual como opciones. Si son String, el JOptionPane pondrá tantos botones como String. Si son cualquier otra cosa, se les tratará como Stringllamando al método toString(). Si se pasa null, saldrán los botones por defecto que se hayan indicado en optionType.

  initialValue: Selección por defecto. Debe ser uno de los Object que hayamos pasado en el parámetro options. Se puede pasar null.

La llamada a JOptionPane.showOptionDialog() devuelve un entero que representa la opción que ha seleccionado el usuario. La primera de las opciones del array es la posición cero. Si se cierra la ventana con la cruz de la esquina superior derecha, el método devolverá -1.

Un ejemplo de cómo llamar a este método

¿JFrame o JDialog?


Cuando queremos hacer ventanitas en java nos encontramos con dos ventanas: El JFrame y el JDialog. ¿Cuándo se usa una u otra?, ¿Qué diferencias hay entre ellas? 
Los JDialog admiten un padre y pueden ser o no modales. ¿Para qué sirve ese padre? ¿Puedo hacer cualquier JDialog modal? 
Vamos a tratar en este tutorial de echar un vistazo a JFrame y JDialog, Trataremos de responder a todas estas preguntas.

JFrame y JDialog

Los dos tipos de ventanas principales que tenemos en java son JFrame y JDialog. Hay varias diferencias entre ellas y en función de estas diferencias vamos a ver para qué sirven

viernes, 1 de junio de 2012

Graficos Estadisicos (JFreeChart)

JFreeChart

JFreeChart es una librería la cual nos permite hacer gráficos de una forma muy sencilla, esta librería posee todo tipo de gráficos, desde tortas, líneas, barras, etc.
Añadir librerías a NetBeans

Para hacer uso de esta clase antes que nada debemos descargarnos el JFreeChart, a continuación dejo el link de descarga directa:

http://sourceforge.net/projects/jfreechart/files/latest/download?source=files

Una vez descargada la librería, deberán desomprimir el rar, se descomprime una carpeta llamada “jfreechart – 1.0.XX”, dentro de esta se encuentra otra carpeta llamada “lib”, que es la que contiene los .jar para agregar al netbeans (jcommon-1.0.XX.jar y jfreecahrt-1.0.XX.jar).
Para agregar estas 2 librerias a nuestro IDE NetBeans, tenemos que dirijirno a:

barra de menú à Tools àLibrariesà(1) New Library à Le ponen JFreeChart de nombre y tipo Class Libraries à Una vez creada tocan el botón Add JAR/Folder à Buscan dentro de la carpeta “lib” el jar del JFreeChart y lo agregan. à Repiten los pasos desde (1) New Library cámbienle el nombre por JCommon, y al buscar el jar en este caso va a ser el de JCommon.


Una vez hecho esto, en nuestro proyecto de netbeans que vayamos a necesitar de estas librerías, buscamos la carpetita Libraries clic derecho y presionamos Add Library, y buscamos nuestras librerías creadas y las agregamos.

Ya con todo esto podemos empezar a sacarle jugo a nuestra nueva librería JFreeChart

Uso de JFreeChart

jueves, 31 de mayo de 2012

La clase Graphics

Casi todas las componentes y contenedores de Swing tienen un método paint(g) asociado que sirve para dibujarlos en pantalla. Java invoca este método automáticamente cuando tiene que mostrar, de forma estándar, la componente o contenedor en cuestión (esto es, sus bordes, su título, si lo tiene, etc.)
El método paint(g) se redefine cuando se quiere que estos elementos tengan un aspecto particular, por ejemplo, cuando se quiere dibujar algo específico sobre ellos.
El método paint(g) es de la forma

public void paint(Graphics g) {
...
}

Donde g es un objeto de la clase abstracta Graphics. Todo contenedor o componente que se pueda dibujar en pantalla tiene asociado un objeto g de esta clase, con la información sobre el área de la pantalla que el

lunes, 28 de mayo de 2012

JDBC: Conexión con Base de Datos

¿Que es JDBC?
      JDBC es el acrónimo de Java Database Connectivity, una API  que permite la ejecución de operaciones sobre bases de datos desde el lenguaje de programación JAVA, independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se accede utilizando el lenguaje SQL del móldelo de base de datos que se utilice.
      Esta conformada por diversas clases e interfaces ubicadas en el paquete java.sql.

La necesidad de una librería
      Al trabajar con JDBC resulta necesario agregar un jar al proyecto que contiene las clases necesarias que se utilizan para “dialogar” con un DBMS. Cada DBMS tiene su propio archivo jar. Estos archivos se pueden obtener de:

      -http://developers.sun.com/product/jdbc/drivers

También es posible conseguir estos archivos jar en la página web correspondiente a cada DBMS, por ejemplo, en caso de usar DMBS Oracle es posible buscarlo en la página de Oracle: www.oracle.com. En nuestro caso vamos a usar el jar de MySQL, el MySQL connector y lo podemos descargar desde acá:


Dentro del zip que se descarga se encuentra el jar.

Conexión con la base de datos

-La interfaz Connection
      Para poder trabajar con una base de datos, el punto de partida siempre es conseguir una conexión, es decir un objeto de tipo Connection (este objeto pertenece a una clase que implementa la interfaz Connection).

Base de Datos


El lenguaje SQL

      El Lenguaje de Consulta Estructurado (SQL = Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones sobre las mismas. Una de sus características es el manejo de algebra y el calculo relacional permitiendo lanzar consultas con el fin de recuperar información de interés de una base de datos, de una forma sencilla.
      El SQL es un lenguaje de acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones sobre los mismos. Es un lenguaje declarativo de alto nivel, que gracias a si fuerte base teórica y si orientación al manejo de conjuntos de registros, y no a registros individuales, permite una alta productividad en codificación.
      Es el lenguaje utilizado universalmente para interactuar con base de datos, permitiendo realizar consultas, inserciones, actualizaciones y eliminaciones de datos, como así también de base de datos.

La interfaz Gráfica


La historia: AWT

         Fue definido como un conjunto de paquetes inicialmente, para la construcción de interfaces graficas. Esta basado en contenedores gráficos mas componentes gráficos, mas modelo de eventos. Los componentes de AWT están implementados en código nativo, es decir que están restringidos a las características de la plataforma.
         Por ejemplo si la plataforma no permite imágenes en los botones, entonces no será posible construir un botón con una imagen en lugar del texto. La mayoría de los componentes de AWT son subclases de Component, excepto los contenedores de mayor nivel como Frame, Dialog y Applet.

Estructura de una aplicación AWT

         Los componentes de AWT están dentro del paquete java.awt. Todo componente se utiliza dentro de un java.awt.Frame. La pantalla a construir será una subclase de java.awt.Frame. La pantalla estará compuesta por:
         Los atributos, que son componentes gráficos. Los métodos, que manejan los eventos que ocurren sobre los componentes gráficos. El método initComponent(), método llamado por el constructor donde se inicializan todos los componentes gráficos.

La actualidad: Swing

         Swing, nombre del proyecto dedicado a la construcción de componentes gráficos. Si bien ha

lunes, 21 de mayo de 2012

Streams

Definición
      Un Streams es un medio utilizado para leer datos de una fuente y para escribir datos en un destino. Tanto la fuente como el destino pueden ser archivos, sockets, memoria, cadena de caracteres, y también procesos.
      Los Streams se caracterizan por se unidireccionales, es decir que un Stream se utilizara solo para leer, solo para escribir, pero no ambas acciones al mismo tiempo.
      Para utilizar una Stream, el programa a realizar deberá construir el Stream relacionándolo directamente con una fuente o con un destino, dependiendo si se necesita leer o escribir información.
      La acción de leer información de una fuente es conocida también como input, y la acción de escribir información es un destino es conocida como output. Dentro de Java, todas las clases utilizadas tanto para el input como para el output están incluidas en el paquete Java.io

viernes, 18 de mayo de 2012

Excepciones


Definición

           
Una excepción que no fue capturada correctamente hace que el sistema se caiga. Una excepción es un evento que ocurre durante la ejecución de un programa, que interrumpe el flujo normal de ejecución.
                Java usa excepciones para el manejo de errores, error handling. Es un sinónimo de eventos excepcionales. Un buen manejo de Excepciones hace a un sistema robusto y estable, confiable.

Iteradores (Recorrido de Contenedores)


Es un patrón de diseño utilizado para recorrer las colecciones. En java es una interfaz denominada Iterator. Esta formado por 3 métodos:

ü  boolean hasNext(): retorna true en caso de haber mas elementos y false en caso de llegar al final de iterator
ü  Object next(): retorna el siguiente elemento en la iteración
ü  void remove(): remueve el ultimo elemento devulto por la iteración

En las clases Vector, ArrayList, HashSet y TreeSet un iterador se consigue a través del método: Iterator iterator(). Se utiliza de la siguiente manera:

Contenedores (Colecciones)


Definición:
     Los contenedores son el modo de agrupar objetos. También llamados colecciones (Collection). Representa a un conjunto de ítems, un conjunto de objetos, que pueden ser homogéneos o no. Por ejemplo, una agenda es una colección de datos de personas.

lunes, 14 de mayo de 2012

Conceptos Generales (Comparación entre objetos)


El operador ==

      Este operador esta sobrecargado para operar con objetos. Se utiliza para saber si dos punteros apuntan al mismo objeto, es decir que son dos referencias de la misma instancia de objeto. Retorna true o false según el resultado de la comparación.
      Ejemplo:

         String c1 = new String (“Juan”);
         String c2 = c1;
        
         if (c1==c2){
         System.out.println(“c1 y c2 apuntan al mismo objeto”);
         }

En este caso se va a informar que apuntan al mismo objeto ya que el resultado de la comparación es true.

El método equals()

      Se utiliza para saber si dos objetos son iguales, si el contenido es igual. Esta redefinido por la subclase que lo utiliza. En la clase String se utiliza para saber si dos objetos String son iguales.
      En la clase Integer se utiliza para saber si dos objetos Integer son iguales. Retorna true  o false según el resultado de la comparación.
      Ejemplo:

         String c1 = new String (“Juan”);
         String c2 = new String (“Pedro”);

         if(c1.equals(c2)){
         System.out.println(“c1 y c2 son iguales”);
         }


En este caso no se va a informar nada ya que no es true el resultado de la comparación.

Conceptos Generales (Wrappers de tipos de dato primitivos)


Definición

      Es la representación de los valores primitivos como objetos, son utilizados para envolver los tipos de datos primitivos. En general tienen dos constructores:

      - Con los valores primitivos como parámetros.
      - Con los valores primitivos como cadena de caracteres, como parámetro.

Tienen un método estático valueOf() que retorna un objeto Wrapper(Integer, Long, Double, Float, etc). 

La clase Integer

      Utilizada para envolver el tipo de dato prmitivo int. Es una subclase de java.lang.Number.

      Ejemplo en Java:

         Integer miEntero = new Integer(50);
         Integer miOtroEntero = Integer.valueOf(“50”);

La clase Float

      Utilizada para envolver el tipo de dato primitivo float. Es una subclase de java.lang.Number.

      Ejemplo en Java:

         Float miPuntoFlotante = new Float(45.67);
         Float miOtroPuntoFlotante = Float.valueOf(“45.67”);

La clase Number

      Representa el concepto abstracto de un numero en Java. Tiene como objetivo ser la superclase de los Wrappers de los tipos de datos numéricos primitivos. Es una clase abstracta, es decir no se puede instanciar.

Conceptos Generales (La clase System)

Definición:
     
      La clase System representa al sistema donde se esta ejecutando el programa Java. Por lo tanto se la puede utilizar para interactuar con el entorno en el que corre, y utilizar las propiedades del entorno, sistema operativo, usuario y demás.

Donde utilizarla:

      Puede accederse a la salida estándar del proceso, a la salida de error del proceso y a la entrada estándar del proceso mediante, System.out, System.err, System.in respectivamente, de modo de poder interactuar con el sistema operativo. También permite obtener el tiempo en milisegundos llamando al sistema operativo para lograr este objetivo.
      Otra cosa muy útil de la clase System es que permite cargar librerías externas en una línea de ejecución con el método load (), mediante esta operación se logra cargar librerías en tiempo de corrida del programa y suma así funcionalidades a nuestros programas.
      Posee atributos y métodos de uso general, y son todos estáticos, es decir atributos y métodos de clase. No es una clase instanciable.

Entre los métodos mas conocidos están:

 ü  exit() à termina la ejecución de la JVM

 ü  gc() à invoca al Garbage Collector

 ü  getProperties() à trae todas las propiedades del sistema

 ü  getProperty() à trae una propiedad en particular del sistema

Conceptos Generales (La clase String)


Definición
     
      La clase String es utilizada para manejar cadenas de caracteres. El operador + se utiliza para concatenar Strings.
      Entre los métodos mas conocidos esan charAt(), equals(), length(), replaceAll().

Inicialización de un String

      Las formas de declarar e inicializar un objeto de la clase String son las siguientes:

         String cadena1 = “Soy una cadena de caracteres”;
         String cadena2 = new String (“Soy una cadena de caracteres”);

         char [] caracteres  = {‘h’, ‘o’, ‘l’, ‘a’};
         String cadena3 = new String (caracteres);


      Todos los objetos en Java heredan de la clase Object, y la clase Object tiene un método toString() que nos retorna la representación del objeto en un String.
      Este método se puede sobrescribir de modo tal que la información que se retorne en el String resultado sea propia de la instancia de la clase.

      Ejemplo:

         public class Auto{

                prívate String patente;
                prívate String marca;
                prívate String modelo;

                //Aca van los constructores

                //Aca van los setters y getters

                //El método siguiente es el retorna el objeto Auto como un String
                @Override
                public String toString(){
                return “Patente: ” + this.patente + “\nMarca: ” + this.marca + “\nModelo: ” + this.modelo;
                }
         }


Métodos mas importantes

La clase String también tiene los siguientes métodos:

 ü  compareTo(String) à compara un String con otro por igualdad.

 ü  concat(String) à concatena un String con otro.

 ü  contains() à evalua si una cadena de caracteres esta contenida en el String

 ü  startsWith(String prefijo) à evalua si el String comienza con el prefijo

 ü  endsWith(String sufijo) à evalua si el String termina con el sufijo

 ü  valueOf() à convierte cualquier tipo básico, boolean, long, doublé, int, en un String.

 ü  Split (String expresionRegular) à separa en partes según la expresión regular.

 ü  subString(int comienzo, int fin) à retorna un bloque desde comienzo y hasta fin.

 ü  Matches(String expresionRegular) à evalua si el String contiene la expresión regular. 

Accesibilidad


Acceso privado, palabra clave “private”

      Al definir un atributo, método o clase como privado, se le esta dando acceso solo desde la clase donde fue definido. Por ejemplo, en el caso de velocidad de un Auto:

         public class Auto{

               private int velocidad;

               public void acelerar(){
               this.velocidad += 10;
               }
        
         }

      Por lo tanto el único modo de acceder a modificar la velocidad es a través del método acelerar. Esta propiedad no esta accesible desde ningún otro alcance sino el de la clase.
      Para poder acceder al atributo velocidad, solo podrán hacerlo los métodos de la misma clase.

Acceso por defecto, “default” o “package”

      En el caso del acceso por defecto, que es el acceso cuadno no se declara la accesibilidad a un atributo, método o clase, el acceso es dentro del mismo paquete o directorio. Por ejemplo si tengo dos clases Auto y Camion, y auto tiene un conductor sin definir su accesibilidad, es decir:

         package vehículos;
        
               public class Auto extends Vehiculo{
        
                               Conductor getConductor(){
                               //Acá se retorna el conductor
                               }
         }
   
Luego en la clase Camion que esta en el mismo package:

      package vehículos;
     
      public class Camion extends Vehiculo{
        
         public void comunicar(Vehiculo v){
         v.getConductor().conversar(); //Se tiene acceso a getConductor por estar ambas clases en el mismo package.
         }

      }


Para poder acceder al método getConductor() podrán hacerlo únicamente las clases ubicadas en el mismo package o directorio.

Acceso protegido, palabra clave “protected”

      Al definir un atributo o método como protegido estamos dejándolo disponible para las clases que heredan de esta clase, ejemplo:

         public class Vehiculo{
               protected int cantidadDeRuedas = 4;
         }

      Luego en la clase Auto, tendremos acceso a cantidadDeRuedas:

         public class Auto extends Vehiculo{
               
                public int getCantidadDeRuedas(){
                return this.cantidadDeRuedas;
                }
         }


      Para poder acceder al atributo cantidadDeRuedas, solo podrán hacerlo las clases que heredan de Vehiculo, es decir la familia de clases.

Acceso publico, palabra clave public

      Definiendo un atributo o método o clase como público permite que se tenga acceso a estos desde cualquier alcance, desde todos lados.
      Acceder a los atributos públicos, todos podrán hacerlo.

Resumen de accesibilidad

Accesibilidad
Acceso en la misma clase
Acceso en el mismo package
Acceso en el árbol de herencia
Acceso desde todas las clases
private
Si
No
No
No
default o package
Si
Si
No
No
protected
Si
Si
Si
No
public
Si
Si
Si
Si

La keyword Final


Definición:

      Es una palabra reservada de Java. Tiene una semántica distinta según donde se la utilice.

Aplicable a atributos:

      Aplicada en atributos representa a un valor constante.
      Ejemplo:

         public final int valorCuota = 100;

      Este valor no puede ser modificado en ningún momento  de la programación. Es un valor constante que no se modifica.

Aplicable a métodos:

      Aplicada en métodos representa la no modificación de un método en el caso de querer sobrescribirlo en una clase.
      Ejemplo:

         public final void moverPieza(){
         }

      En caso de heredar de esta clase, no se podrá sobrescribir el método moverPieza(), quedara con su comportamiento original y no se puede modificar.

Aplicable a clases:

      Aplicada en clases significa que esa clase no se puede extender o no se puede hacer una subclase, es decir que no se puede generar una clase que herede de ella. Cierra el árbol de herencias y queda como una hoja de este árbol.
      Ejemplo:

         public final class Hombre{
         }

      Esta técnica puede ser utilizada cuando se entrega una librería o parte de un programa y se quiere que, quien utilice estas clases, no pueda heredar de estas clases para modificar su comportamiento. Es una medida de seguridad al compartir código o publicar programas.