Saturday, October 23, 2010

ALGORITMOS DE BÚSQUEDA

Hace algún tiempo que no posteaba en este BLOGs por temas de tiempo, pero hoy regreso a postear sobre un tema interesante y es sobre diferentes algoritmos de búsqueda que son:

- Lineal
- Binario

I.- ALGORITMO LINEAL: Es bien común y consta que la iteración de un arreglo posición por posición hasta encontrar un TRUE en lo relacionado al comparativo que se va haciendo. Este algoritmo es bueno para distancias cortas pero por ejemplo si se requiere buscar una lista cargada con 40'000 registros y el ID buscado esta en la posición 39'999, uno por uno se mandara a comparar. Esto es un problema.

II.- ALGORTIMO BINARIO: Muchos no lo conocen pero este algoritmo sale a solucionar un el gran problema que el Algoritmo Lineal tiene con las listas grandes. Este Algoritmo tiene una lógica basada en simplemente decir:

NumeroAuxiliar = ( "Numero Inicial del Arreglo" + "Numero Final del Arreglo" ) / 2


Esto automáticamente enviara el INDICE al centro del Arreglo, de ahí se tiene que realizar una validación contra el número a buscar tanto por ‘IZQ como DER':

Aquí la matriz:

NumeroBuscar > NumeroAuxiliar
INCREMENTO: posicionArreglo ++

NumeroBuscar < NumeroAuxiliar
DECREMENTO: posicionArreglo --

NumeroBuscar = NumeroAuxiliar
"NUMERO ENCONTRADO"

Esto agiliza hasta en un 70% la velocidad del motor de búsqueda:

El ejemplo continuación muestra los dos Algoritmos de Búsqueda en dos modos de realizarlo, el 1er modo utilizando comandos de iteración como el típico FOR y el 2do modo: utilizando RECURSIVIDAD. Así los ejemplos estarán a GUSTO DE TODOS.

Para probar el ejemplo simplemente descomentar el método deseado y este se ejecutara e imprimirá un LOG detallado con los resultados:

iteacion.busquedaLineal( numero, arregloNumeros );
//iteacion.busquedaBinaria( numero, arregloNumeros );
//iteacion.busquedaLinealRecursiva( numero, arregloNumeros );
//iteacion.busquedaBinariaRecursiva( numero, arregloNumeros );

public static int[] arregloNumeros = { 111, 222, 333, 444, 555, 666, 777, 888 , 999 };


- Numero Buscar: 999
- Inicio: 0
- Fin: 8
------- ORDEN: [0] -------
ES MAYOR ...!!!
999 > 111

- Numero Buscar: 999
- Inicio: 1
- Fin: 8
------- ORDEN: [1] -------
ES MAYOR ...!!!
999 > 222

- Numero Buscar: 999
- Inicio: 2
- Fin: 8
------- ORDEN: [2] -------
ES MAYOR ...!!!
999 > 333

- Numero Buscar: 999
- Inicio: 3
- Fin: 8
------- ORDEN: [3] -------
ES MAYOR ...!!!
999 > 444

- Numero Buscar: 999
- Inicio: 4
- Fin: 8
------- ORDEN: [4] -------
ES MAYOR ...!!!
999 > 555

- Numero Buscar: 999
- Inicio: 5
- Fin: 8
------- ORDEN: [5] -------
ES MAYOR ...!!!
999 > 666

- Numero Buscar: 999
- Inicio: 6
- Fin: 8
------- ORDEN: [6] -------
ES MAYOR ...!!!
999 > 777

- Numero Buscar: 999
- Inicio: 7
- Fin: 8
------- ORDEN: [7] -------
ES MAYOR ...!!!
999 > 888

- Numero Buscar: 999
- Inicio: 8
- Fin: 8
------- ENCONTRADO: [8] -------
999 = 999

---------- TOTAL DE PASOS (BUSQUEDA LINEAL): [9] ----------

- Numero Buscar: 999
- Inicio: 0
- Fin: 8
- Suma: 8
------- ORDEN: [4] -------
ES MAYOR ...!!!
999 > 555

- Numero Buscar: 999
- Inicio: 5
- Fin: 8
- Suma: 13
------- ORDEN: [6] -------
ES MAYOR ...!!!
999 > 777

- Numero Buscar: 999
- Inicio: 7
- Fin: 8
- Suma: 15
------- ORDEN: [7] -------
ES MAYOR ...!!!
999 > 888

- Numero Buscar: 999
- Inicio: 8
- Fin: 8
- Suma: 16
------- ENCONTRADO: [8] -------
999 = 999

---------- TOTAL DE PASOS (BUSQUEDA BINARIA): [4] ----------

999 != 111
999 != 222
999 != 333
999 != 444
999 != 555
999 != 666
999 != 777
999 != 888
999 == 999
---------- TOTAL DE PASOS (BUSQUEDA LINEAL RECURSIVA): [9] ----------

------- ORDEN: [4] -------
ES MAYOR ...!!!
999 > 555

------- ORDEN: [6] -------
ES MAYOR ...!!!
999 > 777

------- ORDEN: [7] -------
ES MAYOR ...!!!
999 > 888

ENCONTRADO ...!!!
999 == 999

---------- TOTAL DE PASOS (BUSQUEDA BINARIA RECURSIVA): [4] ----------

Para descarga del demo completo pulsar AQUÍ.

Saturday, April 17, 2010

CARGAR CADENA DE TEXTO EN 'PDF'.

En muchas ocaciones se tiene la necesidad de que nuestros listados o mensajes que mostramos en una Grilla o un TextArea los exportemos en un .PDF para que con esto lo podamos imprimir o llevarlo en un USB a otro destino. Para este ejemplo nos apoyamos en un ejemplo básico en la clase 'ITEXT'. Y el truco está en jugar con la concatenacion de los datos de dicho listado en un dato de tipo String y mandarlo de parametró al método mostrado en el ejemplo.

El código es el siguiente:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;

/**
* @author Cesar Ricardo.
* @clase: MuestraTextoPDF.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
* http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class MuestraTextoPDF{

private static final String RUTA_PATH = System.getProperty( "user.dir" );
private static final String FICHERO = "Reporte_2010.pdf";

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){

String tituloPDF = "...::: PROFILE 2010 :::...";
String textPDF = " Cesar Ricardo Guerra Arnaiz: " + "\n" + "\n" +
" Informático, interesado en Tecnología, Herramientas OpenSource, Motores de Datos, Lenguajes de Programación, " +
" Frameworks, WebService, XML, SOA, Message Broker, Websphere, Ides, Ajax, etc. Abocado y especializado a todo " +
" lo relacionado al mundo JAVA. ";

MuestraTextoPDF pdf = new MuestraTextoPDF();
pdf.muestraTextoEnPDF( textPDF, tituloPDF );
}

/**
* muestraTextoEnPDF
* @param textPDF
* @param tituloPDF
*/
public void muestraTextoEnPDF( String textPDF, String tituloPDF ){

int ancho = 800;
int alto = 600;

Rectangle objRectangulo = null;
Document objDocumento = null;
Paragraph objParagraph = null;

File archivoSalida = null;
FileOutputStream archivoOutput = null;

String rutaFichero = null;

try{
objRectangulo = new Rectangle( ancho, alto );
objDocumento = new Document( objRectangulo );
archivoOutput = new FileOutputStream( FICHERO );

PdfWriter.getInstance( objDocumento, archivoOutput );

objDocumento.addTitle( tituloPDF );
objDocumento.open();

objParagraph = new Paragraph( textPDF );
objDocumento.add( objParagraph );

rutaFichero = (RUTA_PATH + "/" + FICHERO);

System.out.println( "RUTA PATH: " + rutaFichero );

archivoSalida = new File( rutaFichero );
}
catch( IOException e ){
e.printStackTrace();
}
catch( Exception e ){
e.printStackTrace();
}
finally{
if( objDocumento != null ){
if( objDocumento.isOpen() == true ){
objDocumento.close();
}
}
}

try{
//Manda Abrir Fichero 'PDF'.
//Desktop.getDesktop().open( archivoSalida );
Runtime.getRuntime().exec( "rundll32 url.dll, FileProtocolHandler " + archivoSalida );
}
catch( Exception e ){
e.printStackTrace();
}
}
}

MANEJO DE LA CLASE: java.lang.Math

Que tal, en esta oportunidad postearé sobre un clase muy importante en lo que respecta cálculos Matemáticos y con la que se puede realizar muchas operaciones y redondeos muy buenos. El ejemplo que mostraré esta basado en 'NOTAS' de las cuales se procederá con los cálculos respectivos:

El código es el siguiente:

/**
* @author Cesar Ricardo.
* @clase: CalculodeNotas.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class ManejoMath{

/**
* main
* @param argumentos
*/
public static void main( String... argumentos ){
ManejoMath calcular = new ManejoMath();
calcular.calcularNota();
}

/**
* calcularNota
*/
public void calcularNota(){

int notaMatematica = 10;
int notaLenguaje = -2;
double notaHistoria = 9.55;
double notaBiologia = 8.3;

//Valores Absolutos
imprimir( "----------- VALORES 'ABSOLUTOS' -----------" );
imprimir( "- MATEMATICA: [" + notaMatematica + "] nota 'ABSOLUTA': [" + this.getValorAbsoluto( notaMatematica ) + "]" );
imprimir( "- LENGUAJE: [" + notaLenguaje + "] nota 'ABSOLUTA': [" + this.getValorAbsoluto( notaLenguaje ) + "]" );
imprimir( "- HISTORIO: [" + notaHistoria + "] nota 'ABSOLUTA': [" + this.getValorAbsoluto( notaHistoria ) + "]" );
imprimir( "- BIOLOGIA: [" + notaBiologia + "] nota 'ABSOLUTA': [" + this.getValorAbsoluto( notaBiologia ) + "]" );

System.out.println( "" );

//Redondeo de cifras al siguiente numero entero
imprimir( "----------- VALORES 'REDONDEADOS' -----------" );
imprimir( "- MATEMATICA: [" + notaMatematica + "] nota 'REDONDEADO': [" + this.getRedondeo( notaMatematica ) + "]" );
imprimir( "- LENGUAJE: [" + notaLenguaje + "] nota 'REDONDEADO': [" + this.getRedondeo( notaLenguaje ) + "]" );
imprimir( "- HISTORIO: [" + notaHistoria + "] nota 'REDONDEADO': [" + this.getRedondeo( notaHistoria ) + "]" );
imprimir( "- BIOLOGIA: [" + notaBiologia + "] nota 'REDONDEADO': [" + this.getRedondeo( notaBiologia ) + "]" );

System.out.println( "" );

//El techo ("ceiling") de un número es el minimo entero mayor o igual
//al mismo numero. Un numero entero es su propio techo ("ceiling")
imprimir( "----------- VALORES 'CEILING' -----------" );
imprimir( "- MATEMATICA: El 'ceiling' de: [" + notaMatematica + "] es: [" + this.getMinimoEnteroMayorIgual( notaMatematica ) + "]" );
imprimir( "- LENGUAJE: El 'ceiling' de: [" + notaLenguaje + "] es: [" + this.getMinimoEnteroMayorIgual( notaLenguaje ) + "]" );
imprimir( "- HISTORIO: El 'ceiling' de: [" + notaHistoria + "] es: [" + this.getMinimoEnteroMayorIgual( notaHistoria ) + "]" );
imprimir( "- BIOLOGIA: El 'ceiling' de: [" + notaBiologia + "] es: [" + this.getMinimoEnteroMayorIgual( notaBiologia ) + "]" );

System.out.println( "" );

//El piso ("floor") de un numero es el entero mayor o igual al mismo numero.
//Un numero entero es su propio piso ("floor")
imprimir( "----------- VALORES 'FLOOR' -----------" );
imprimir( "- MATEMATICA: El 'floor' de: [" + notaMatematica + "] es: [" + this.getMayorIgual( notaMatematica ) + "]" );
imprimir( "- LENGUAJE: El 'floor' de: [" + notaLenguaje + "] es: [" + this.getMayorIgual( notaLenguaje ) + "]" );
imprimir( "- HISTORIO: El 'floor' de: [" + notaHistoria + "] es: [" + this.getMayorIgual( notaHistoria ) + "]" );
imprimir( "- BIOLOGIA: El 'floor' de: [" + notaBiologia + "] es: [" + this.getMayorIgual( notaBiologia ) + "]" );

System.out.println( "" );

//min() retorna el menor de los argumentos proporcionados.
imprimir( "----------- VALORES 'MINIMO' -----------" );
imprimir( "- El 'MINIMO' valor entre: [" + notaMatematica + ", " + notaLenguaje + "] es: [" + this.getValorMinimo( notaMatematica, notaLenguaje ) + "]" );
imprimir( "- El 'MINIMO' valor entre: [" + notaHistoria + ", " + notaBiologia + "] es: [" + this.getValorMinimo( notaHistoria, notaBiologia ) + "]" );
imprimir( "- El 'MINIMO' valor entre: [" + notaMatematica + ", " + notaHistoria + "] es: [" + this.getValorMinimo( notaMatematica, notaHistoria ) + "]" );
imprimir( "- El 'MINIMO' valor entre: [" + notaBiologia + ", " + notaLenguaje + "] es: [" + this.getValorMinimo( notaBiologia, notaLenguaje ) + "]" );
imprimir( "- El 'MINIMO' valor entre: [" + notaBiologia + ", " + notaBiologia + "] es: [" + this.getValorMinimo( notaBiologia, notaBiologia ) + "]" );

System.out.println( "" );

//max() retorna el mayor de los argumentos proporcionados
imprimir( "----------- VALORES 'MAXIMO' -----------" );
imprimir( "- El 'MAXIMO' valor entre: [" + notaMatematica + ", " + notaLenguaje + "] es: [" + this.getValorMaximo( notaMatematica, notaLenguaje ) + "]" );
imprimir( "- El 'MAXIMO' valor entre: [" + notaHistoria + ", " + notaBiologia + "] es: [" + this.getValorMaximo( notaHistoria, notaBiologia ) + "]" );
imprimir( "- El 'MAXIMO' valor entre: [" + notaMatematica + ", " + notaHistoria + "] es: [" + this.getValorMaximo( notaMatematica, notaHistoria ) + "]" );
imprimir( "- El 'MAXIMO' valor entre: [" + notaBiologia + ", " + notaLenguaje + "] es: [" + this.getValorMaximo( notaBiologia, notaLenguaje ) + "]" );
imprimir( "- El 'MAXIMO' valor entre: [" + notaBiologia + ", " + notaBiologia + "] es: [" + this.getValorMaximo( notaBiologia, notaBiologia ) + "]" );
}

//Imprimir datos.
void imprimir( String cadena ){
System.out.println( cadena );
}

/**
* getValorAbsoluto
* @param notaParam
* @return Number
*/
public Number getValorAbsoluto( Number notaParam ){

Number objetoNumero = 0;

if( notaParam instanceof Double ){
objetoNumero = Math.abs( Double.parseDouble( notaParam.toString() ) );
}
else if( notaParam instanceof Float ){
objetoNumero = Math.abs( Float.parseFloat( notaParam.toString() ) );
}
else if( notaParam instanceof Integer ){
objetoNumero = Math.abs( Integer.parseInt( notaParam.toString() ) );
}
else if( notaParam instanceof Long ){
objetoNumero = Math.abs( Long.parseLong( notaParam.toString() ) );
}

return objetoNumero;
}

/**
* getRedondeo
* @param notaParam
* @return Number
*/
public Number getRedondeo( Number notaParam ){

Number objetoNumero = 0;

if( notaParam instanceof Double ){
objetoNumero = Math.round( Double.parseDouble( notaParam.toString() ) );
}
else if( notaParam instanceof Float ){
objetoNumero = Math.round( Float.parseFloat( notaParam.toString() ) );
}
else if( notaParam instanceof Integer ){
objetoNumero = Math.round( Integer.parseInt( notaParam.toString() ) );
}

return objetoNumero;
}

/**
* getMayorIgual
* @param notaParam
* @return Number
*/
public Number getMayorIgual( Number notaParam ){

Number objetoNumero = 0;

if( notaParam instanceof Double ){
objetoNumero = Math.ceil( Double.parseDouble( notaParam.toString() ) );
}
else if( notaParam instanceof Integer ){
objetoNumero = Math.ceil( Integer.parseInt( notaParam.toString() ) );
}

return objetoNumero;
}


/**
* getMinimoEnteroMayorIgual
* @param notaParam
* @return Number
*/
public Number getMinimoEnteroMayorIgual( Number notaParam ){

Number objetoNumero = 0;

if( notaParam instanceof Double ){
objetoNumero = Math.floor( Double.parseDouble( notaParam.toString() ) );
}
else if( notaParam instanceof Integer ){
objetoNumero = Math.floor( Integer.parseInt( notaParam.toString() ) );
}

return objetoNumero;
}

/**
* getValorMaximo
* @param notaParam_01
* @param notaParam_02
* @return Number
*/
public Number getValorMaximo( Number notaParam_01, Number notaParam_02 ){

Number objetoNumero = 0;

if( (notaParam_01 instanceof Integer) && (notaParam_02 instanceof Integer) ){
objetoNumero = Math.max( Integer.parseInt( notaParam_01 + "" ),
Integer.parseInt( notaParam_02 + "" ) );
}
else if( (notaParam_01 instanceof Double) && (notaParam_02 instanceof Double) ){
objetoNumero = Math.max( Double.parseDouble( notaParam_01 + "" ),
Double.parseDouble( notaParam_02 + "" ) );
}
else if( (notaParam_01 instanceof Double) && (notaParam_02 instanceof Integer) ){
objetoNumero = Math.max( Double.parseDouble( notaParam_01 + "" ),
Integer.parseInt( notaParam_02 + "" ) );
}
else if( (notaParam_01 instanceof Integer) && (notaParam_02 instanceof Double) ){
objetoNumero = Math.max( Integer.parseInt( notaParam_01 + "" ),
Double.parseDouble( notaParam_02 + "" ) );
}

return objetoNumero;
}

/**
* getValorMinimo
* @param notaParam_01
* @param notaParam_02
* @return Number
*/
public Number getValorMinimo( Object notaParam_01, Object notaParam_02 ){

Number objetoNumero = 0;

if( (notaParam_01 instanceof Integer) && (notaParam_02 instanceof Integer) ){
objetoNumero = Math.min( Integer.parseInt( notaParam_01 + "" ),
Integer.parseInt( notaParam_02 + "" ) );
}
else if( (notaParam_01 instanceof Double) && (notaParam_02 instanceof Double) ){
objetoNumero = Math.min( Double.parseDouble( notaParam_01 + "" ),
Double.parseDouble( notaParam_02 + "" ) );
}
else if( (notaParam_01 instanceof Double) && (notaParam_02 instanceof Integer) ){
objetoNumero = Math.min( Double.parseDouble( notaParam_01 + "" ),
Integer.parseInt( notaParam_02 + "" ) );
}
else if( (notaParam_01 instanceof Integer) && (notaParam_02 instanceof Double) ){
objetoNumero = Math.min( Integer.parseInt( notaParam_01 + "" ),
Double.parseDouble( notaParam_02 + "" ) );
}

return objetoNumero;
}
}

La salida en consola luego de la ejecución de dicha clase es la siguiente:

----------- VALORES 'ABSOLUTOS' -----------
- MATEMATICA: [10] nota 'ABSOLUTA': [10]
- LENGUAJE: [-2] nota 'ABSOLUTA': [2]
- HISTORIO: [9.55] nota 'ABSOLUTA': [9.55]
- BIOLOGIA: [8.3] nota 'ABSOLUTA': [8.3]

----------- VALORES 'REDONDEADOS' -----------
- MATEMATICA: [10] nota 'REDONDEADO': [10]
- LENGUAJE: [-2] nota 'REDONDEADO': [-2]
- HISTORIO: [9.55] nota 'REDONDEADO': [10]
- BIOLOGIA: [8.3] nota 'REDONDEADO': [8]

----------- VALORES 'CEILING' -----------
- MATEMATICA: El 'ceiling' de: [10] es: [10.0]
- LENGUAJE: El 'ceiling' de: [-2] es: [-2.0]
- HISTORIO: El 'ceiling' de: [9.55] es: [9.0]
- BIOLOGIA: El 'ceiling' de: [8.3] es: [8.0]

----------- VALORES 'FLOOR' -----------
- MATEMATICA: El 'floor' de: [10] es: [10.0]
- LENGUAJE: El 'floor' de: [-2] es: [-2.0]
- HISTORIO: El 'floor' de: [9.55] es: [10.0]
- BIOLOGIA: El 'floor' de: [8.3] es: [9.0]

----------- VALORES 'MINIMO' -----------
- El 'MINIMO' valor entre: [10, -2] es: [-2]
- El 'MINIMO' valor entre: [9.55, 8.3] es: [8.3]
- El 'MINIMO' valor entre: [10, 9.55] es: [9.55]
- El 'MINIMO' valor entre: [8.3, -2] es: [-2.0]
- El 'MINIMO' valor entre: [8.3, 8.3] es: [8.3]

----------- VALORES 'MAXIMO' -----------
- El 'MAXIMO' valor entre: [10, -2] es: [10]
- El 'MAXIMO' valor entre: [9.55, 8.3] es: [9.55]
- El 'MAXIMO' valor entre: [10, 9.55] es: [10.0]
- El 'MAXIMO' valor entre: [8.3, -2] es: [8.3]
- El 'MAXIMO' valor entre: [8.3, 8.3] es: [8.3]

EJECUTAR UN COMANDO 'PING' DESDE JAVA.

En muchas ocaciones es necesario validar la conexiones que tengamos apuntando hacia diferentes servidores o PC en Red. Para esto una forma de validar conexion con ellos es hacer un simple 'PING' desde consola hacia dichas IPs o HOST. Bueno en este momento mostraré una de las formas para poder realizar este proceso desde JAVA y así validar.

El código es el siguiente:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* @author Cesar Ricardo.
* @clase: JavaPing.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class ManejoComandoPing{

private static final String COMANDO = "ping";
private static final String ESPACIO = " ";
private static final String IP_HOST = "www.google.com";

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){

ManejoComandoPing javaPing = new ManejoComandoPing();

String IP = null;
String otroIP = IP_HOST;

//Validación Previa.
if( argumentos.length > 0 ){
IP = argumentos[ 0 ]; //Desde consola (DOS, UNIX, LINUX).
}
else{
if( (otroIP.equalsIgnoreCase( "" )) ){
IP = "localhost"; //HardCode.
}
else{
IP = otroIP;
}
}

//Validacion IP.
javaPing.validarPingIP( IP );
}

/**
* validarPingIP
* @param IP
*/
public void validarPingIP( String IP ){

String mensaje = null;
String pingCMD = COMANDO + ESPACIO + IP;

try{
Runtime ejecuta = Runtime.getRuntime();
Process proceso = ejecuta.exec( pingCMD );

InputStreamReader entrada = new InputStreamReader( proceso.getInputStream() );
BufferedReader buffer = new BufferedReader( entrada );

String linea = "";

for( ;(linea = buffer.readLine() ) != null; ){
System.out.println( linea );
mensaje += linea;
}

buffer.close();
}
catch( IOException e ){
System.out.println( e );
}
catch( Exception e ){
System.out.println( e );
}
}
}

La salida es la siguiente:

Haciendo ping a www.l.google.com [72.14.204.99] con 32 bytes de datos:

Respuesta desde 72.14.204.99: bytes=32 tiempo=110ms TTL=51

Respuesta desde 72.14.204.99: bytes=32 tiempo=108ms TTL=51

Respuesta desde 72.14.204.99: bytes=32 tiempo=110ms TTL=51

Respuesta desde 72.14.204.99: bytes=32 tiempo=108ms TTL=51

MANEJO DE LA CLASE: java.util.Properties

Muchas veces es necesario que en nuestras aplicaciones tengamos un Archivo de Configuración con los parametros de configuración de parte o de toda nuestra aplicación. Por ejemplo, un archivo de configuración donde se registren las conexiones, drivers, URL, etc de nuestras 'BDs' a las que nos contectamos. Porque realizamos estos?, bueno normalmente para eliminar la tendencia de tener 'HardCodeado' en diferentes parte de nuestra aplicación dichos parametros. Uds dirán y porque no tenerlos en una clase 'Constantes.java', bueno la razón es que dicha clase 'Constantes.java' al ser compilada genera un '.class' y luego del despliegue si queremos editar un campo de dicha clase simplemente 'NO PODREMOS'. Por este motivo lo mejor es tener un archivo de configuración en un fichero de tipo: .PROPERTIES, .XML o un .TXT, ya que estos no se compilan y pueden ser editados en todo momento. En esta oportunidad mostraré la utilidad que brinda la clase: 'java.util.Properties', para el acceso a ficheros de tipo: .PROPERTIES y con ellos poder crearnos un archivo de configuración para nuestras aplicaciones.

FICHERO DE CONFIGURACIÓN:
#####################################################################
################ PROPIEDADES DE PARA ACCESO DE DATOS ################
#####################################################################

#### EL DELIMITADOR DE ACCESO SE PUEDE REGISTRAR CON LA SIMBOLOGÍA => ':', '=', 'BLANCO' ####

propiedad.datos.nombres = Cesar Ricardo
propiedad.datos.apellidos : Guerra Arnaiz
propiedad.datos.direccion Av Naranjal 1029 Los Olivos


CLASE: ManejoJavaProperties

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
* @author Cesar Ricardo.
* @clase: ManejoJavaProperties.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class ManejoJavaProperties{

private static final String RUTA_PATH = "src/org/java/properties/";
private static final String FICHERO = "FicheroConfiguracion.properties";

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){
ManejoJavaProperties properties = new ManejoJavaProperties();
properties.cargarDataFichero();
}

/**
* cargarDataFichero
*/
public void cargarDataFichero(){
try{
String rutaFichero = RUTA_PATH + FICHERO;
Properties objPropiedadFichero = new Properties();
FileInputStream archivoInput = new FileInputStream( rutaFichero );

//Carga Fichero.
objPropiedadFichero.load( archivoInput );

//Obteniendo Datos.
String nombres = objPropiedadFichero.getProperty( "propiedad.datos.nombres" ); //Identificador de 'Nombres' registrado para Acceso.
String apellidos = objPropiedadFichero.getProperty( "propiedad.datos.apellidos" ); //Identificador de 'Apellidos' registrado para Acceso.
String direccion = objPropiedadFichero.getProperty( "propiedad.datos.direccion" ); //Identificador de 'Direccion' registrado para Acceso.

//Imprimiendo Resultados.
System.out.println( "- Dato Obtenido #1: " + nombres );
System.out.println( "- Dato Obtenido #2: " + apellidos );
System.out.println( "- Dato Obtenido #3: " + direccion );

objPropiedadFichero.setProperty( "propiedad.datos.nombres", "Cesar Ricardo = JAVAMAN" );

//El SETEO solo se dá en MEMORIA, no en el fichero FISICO en sí.
nombres = objPropiedadFichero.getProperty( "propiedad.datos.nombres" ); //Identificador de 'Apellidos' registrado para Acceso.
System.out.println( "" );
System.out.println( "- Dato Obtenido #1 (NEW): " + nombres );
}
catch( IOException e ){
e.printStackTrace();
}
catch( Exception e ){
e.printStackTrace();
}
}
}

Para descarga del ejemplo completo pulsar AQUÍ.

MANTENIMIENTO EN MEMORIA CON: HashMap

Que tal, en esta oportunidad mostraré una forma muy facil para poder trabajar en memoria y hacer los 'CRUDs' respectivos 'todo en 'MEMORIA'. El ejemplo mostrado consiste en un POJO administrado por un Objeto 'HashMap' que posee un Key (Identidicador) y un objeto 'Alumno' que representará a cada registros que se haga en el 'HashMap', ya que dicho 'HashMap' se trabaja como si fuera una 'Tabla de BD'. Aqui los siguientes métodos útiles que la clase posee para su facilidad y manipulación de objetos:

- registrarAlumno.
- eliminarObjetoEnMemoria.
- buscarObjetoEnTabla.
- buscarExisteObjetoEnTabla.
- getListaKeysFromObjeto.
- getListaKeysFromHashMap.
- imprimirObjetosHashMap.


El ejemplo es el siguiente:

CLASE: Alumno:
/**
* @author Cesar Ricardo.
* @clase: Alumno.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class Alumno{

private int codigo;
private String nombres;
private String apellidos;
private String edad;


//Constructores ...
public Alumno(){
}

public Alumno( Alumno objAlumno ){
this.codigo = objAlumno.getCodigo();
this.nombres = objAlumno.getNombres();
this.apellidos = objAlumno.getApellidos();
this.edad = objAlumno.getEdad();
}

public Alumno( int codigo, String nombres, String apellidos, String edad ){
this.codigo = codigo;
this.nombres = nombres;
this.apellidos = apellidos;
this.edad = edad;
}

public int getCodigo(){
return codigo;
}

public void setCodigo( int codigo ){
this.codigo = codigo;
}

public String getNombres(){
return nombres;
}

public void setNombres( String nombres ){
this.nombres = nombres;
}

public String getApellidos(){
return apellidos;
}

public void setApellidos( String apellidos ){
this.apellidos = apellidos;
}

public String getEdad(){
return edad;
}

public void setEdad( String edad ){
this.edad = edad;
}

}

CLASE: ManejoHashMap:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
* @author Cesar Ricardo.
* @clase: ManejoHashMap.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class ManejoHashMap{

private static Map tablaDataAlumnos;
private static int codigoCorrelativoTabla = 0;
private static final String SIGLA_CODIGO = "USU000";

{
this.tablaDataAlumnos = new HashMap();
}

//Constructor ...
public ManejoHashMap(){
}

/**
* main
* @param argumentos
*/
public static void main( String[] argumentos ){

ManejoHashMap tablaBD = new ManejoHashMap();

Alumno objAlumno_01 = new Alumno( 1, "Cesar Ricardo", "Guerra Arnaiz", "27" );
Alumno objAlumno_02 = new Alumno( 2, "Catherine Magaly", "Cotrina Vasquez", "25" );
Alumno objAlumno_03 = new Alumno( 3, "Milko Guiovany", "Samamé Hipolito", "36" );

//REGISTRANDO OBJETOS.
tablaBD.registrarAlumno( objAlumno_01 );
tablaBD.registrarAlumno( objAlumno_02 );
tablaBD.registrarAlumno( objAlumno_03 );

tablaBD.imprimirObjetosHashMap(); //Imprime resultados.

//IMPRIMIR KEYS DEL 'HASHMAP'
System.out.println( "" );
List listaKeysHashMap = tablaBD.getListaKeysFromHashMap( tablaDataAlumnos );
System.out.println( "NUMERO KEYS: " + listaKeysHashMap.size() );
System.out.println( "KEYS: " + listaKeysHashMap );

//ELIMINAR OBJETOS REGISTRADOS.
System.out.println( "" );
Alumno objAlumnoEliminar = new Alumno();
objAlumnoEliminar.setCodigo( 1 ); //Seteo de codigo identificador del Objeto.

tablaBD.eliminarObjetoEnMemoria( objAlumnoEliminar );
tablaBD.imprimirObjetosHashMap(); //Imprime resultados.
}

/**
* registrarAlumno
* @param objAlumno
* @return boolean
*/
public boolean registrarAlumno( Alumno objAlumnoParam ){
System.out.println( "********** DENTRO DE 'registrarAlumno' ************ " );

boolean estado = false;
boolean existe = false;

try{
if( objAlumnoParam != null ){

existe = this.buscarExisteObjetoEnTabla( objAlumnoParam );

if( existe == false ){
System.out.println( "NO EXISTE ...!!" );

Alumno objAlumno = new Alumno();

this.codigoCorrelativoTabla ++;

//Seteando ...
objAlumno.setCodigo( objAlumnoParam.getCodigo() );
objAlumno.setNombres( objAlumnoParam.getNombres() );
objAlumno.setApellidos( objAlumnoParam.getApellidos() );
objAlumno.setEdad( objAlumnoParam.getEdad() );

//Agregando ...
this.tablaDataAlumnos.put( SIGLA_CODIGO + codigoCorrelativoTabla, objAlumno );

System.out.println( "OBJETO REGISTRADO ...!!" );

estado = true;
}
else{
System.out.println( "NO EXISTE ...!!" );

estado = false;
}
}
else{
estado = false;
}
}
catch( Exception e ){
e.printStackTrace();
estado = false;
}

return estado;
}

/**
* eliminarObjetoEnMemoria
* @param objAlumnoParam
* @return boolean
*/
public boolean eliminarObjetoEnMemoria( Alumno objAlumnoParam ){
System.out.println( "********** DENTRO DE 'eliminarObjetoEnMemoria' ************ " );

boolean existeRegistro = false;
boolean estado = false;

try{
if( objAlumnoParam != null ){

existeRegistro = this.buscarExisteObjetoEnTabla( objAlumnoParam );

System.out.println( "EXISTE REGISTRO: " + existeRegistro );

//SI ES == 'TRUE', EXISTE EN TABLA Y SE PUEDE ELIMINAR.
if( existeRegistro == true ){

List listaKeysObjeto = this.getListaKeysFromObjeto( tablaDataAlumnos, objAlumnoParam );

String codigoKey = null;
Object objRegistro = null;

//Si tiene algun registros.
if( listaKeysObjeto.size() > 0 ){
codigoKey = listaKeysObjeto.get( 0 ); //Obtiene su KEY del Objeto. //USU00XXX
System.out.println( "KEY 'ELIMINAR': " + codigoKey );
objRegistro = this.tablaDataAlumnos.remove( codigoKey );
}

if( objRegistro != null ){
System.out.println( objRegistro + " Codigo del Objeto Removido ...!!");
}

estado = true;
}
else{
estado = false;
}
}
}
catch( Exception e ){
e.printStackTrace();
estado = false;
}

return estado;
}

/**
* buscarObjetoEnTabla
* @param objAlumnoParam
* @return Alumno
*/
public Alumno buscarObjetoEnTabla( Alumno objAlumnoParam ){
System.out.println( "-------- DENTRO DE 'buscarObjetoEnTabla' --------" );

boolean existe = false;

List listaKeysObjeto = this.getListaKeysFromObjeto( this.tablaDataAlumnos, objAlumnoParam );

String codigoKey = null;
Object objRegistro = null;
Alumno objReturn = null;

//Si tiene algun registros.
if( listaKeysObjeto.size() > 0 ){

codigoKey = listaKeysObjeto.get( 0 ); //Obtiene su KEY del Objeto. //USU00XXX
objRegistro = this.tablaDataAlumnos.get( codigoKey );
}

if( objRegistro != null ){
objReturn = (Alumno)objRegistro;
existe = true;
}
else{
existe = false;
}

return objReturn;
}

/**
* buscarExisteObjetoEnTabla
* @param objAlumnoParam
* @return boolean
*/
public boolean buscarExisteObjetoEnTabla( Alumno objAlumnoParam ){
System.out.println( "-------- DENTRO DE 'buscarExisteObjetoEnTabla' --------" );

boolean existe = false;

List listaKeysObjeto = this.getListaKeysFromObjeto( this.tablaDataAlumnos, objAlumnoParam );

String codigoKey = null;
Object objRegistro = null;

//Si tiene algun registros.
if( listaKeysObjeto.size() > 0 ){

codigoKey = listaKeysObjeto.get( 0 ); //Obtiene su KEY del Objeto. //USU00XXX
objRegistro = this.tablaDataAlumnos.get( codigoKey );
}

if( objRegistro != null ){
existe = true;
}
else{
existe = false;
}

return existe;
}

/**
* getListaKeysFromObjeto
* @param tablaAlumnos
* @param objAlumnoParam
* @return List
*/
public List getListaKeysFromObjeto( Map tablaAlumnosParam, Alumno objAlumnoParam ){

List listaKey = new ArrayList();

//System.out.println( this.tablaDataAlumnos.keySet() );

//Iterando ...
for( String keyAlumno : tablaAlumnosParam.keySet() ){

//System.out.println( keyAlumno );

Alumno objAlumno = tablaAlumnosParam.get( keyAlumno );

if( objAlumno.getCodigo() == objAlumnoParam.getCodigo() ){
listaKey.add( keyAlumno.toString() );
}
}

return listaKey;
}

/**
* getListaKeysFromHashMap
* @param tablaAlumnosParam
* @return List
*/
public List getListaKeysFromHashMap( Map tablaAlumnosParam ){

List listaKeys = new ArrayList();

//System.out.println( tablaAlumnos.keySet() );

//Iterando ...
for( String keyAlumno : tablaAlumnosParam.keySet() ){

//System.out.println( keyAlumno );

listaKeys.add( keyAlumno );
}

return listaKeys;
}

/**
* imprimirObjetosHashMap La impresión se dá en base a un ordenaminento NATURAL.
*/
public void imprimirObjetosHashMap(){
System.out.println( "-------- DENTRO DE 'imprimirObjetosHashMap' --------" );

System.out.println ( "TAMAÑO DE REGISTROS EN 'HASHMAP': " + this.tablaDataAlumnos.size() );

Iterator iterador = this.tablaDataAlumnos.entrySet().iterator();

System.out.println( "-------- DATA TABLA CARGADA --------" );

for( ;iterador.hasNext(); ){
Map.Entry llave = ( Map.Entry)iterador.next();
Alumno objAlumno = (Alumno)llave.getValue();

System.out.println( "- KEY: " + llave.getKey() + " | " +
"- DATA: " + objAlumno.hashCode() + " "
+ objAlumno.getCodigo() + " "
+ objAlumno.getNombres() + " "
+ objAlumno.getApellidos() + " "
+ objAlumno.getEdad() );
}
}

/**
* getTablaDataAlumnos
* @return HashMap
*/
public static Map getTablaDataAlumnos(){
return tablaDataAlumnos;
}
}

La impresión obtenida en consola al ejecutar las clase 'ManejoHashMap' es el siguiente:

********** DENTRO DE 'registrarAlumno' ************
-------- DENTRO DE 'buscarExisteObjetoEnTabla' --------
NO EXISTE ...!!
OBJETO REGISTRADO ...!!
********** DENTRO DE 'registrarAlumno' ************
-------- DENTRO DE 'buscarExisteObjetoEnTabla' --------
NO EXISTE ...!!
OBJETO REGISTRADO ...!!
********** DENTRO DE 'registrarAlumno' ************
-------- DENTRO DE 'buscarExisteObjetoEnTabla' --------
NO EXISTE ...!!
OBJETO REGISTRADO ...!!
-------- DENTRO DE 'imprimirObjetosHashMap' --------
TAMAÑO DE REGISTROS EN 'HASHMAP': 3
-------- DATA TABLA CARGADA --------
- KEY: USU0001 | - DATA: 11394033 1 Cesar Ricardo Guerra Arnaiz 27
- KEY: USU0002 | - DATA: 4384790 2 Catherine Magaly Cotrina Vasquez 25
- KEY: USU0003 | - DATA: 9634993 3 Milko Guiovany Samamé Hipolito 36

NUMERO KEYS: 3
KEYS: [USU0001, USU0002, USU0003]

********** DENTRO DE 'eliminarObjetoEnMemoria' ************
-------- DENTRO DE 'buscarExisteObjetoEnTabla' --------
EXISTE REGISTRO: true
KEY 'ELIMINAR': USU0001
org.java.map.Alumno@addbf1 Codigo del Objeto Removido ...!!
-------- DENTRO DE 'imprimirObjetosHashMap' --------
TAMAÑO DE REGISTROS EN 'HASHMAP': 2
-------- DATA TABLA CARGADA --------
- KEY: USU0002 | - DATA: 4384790 2 Catherine Magaly Cotrina Vasquez 25
- KEY: USU0003 | - DATA: 9634993 3 Milko Guiovany Samamé Hipolito 36

Para descarga del demo completo pulsar AQUÍ.

MANEJO DE LA CLASE: java.awt.Desktop

Que tal amigos, luego de un buen tiempo no POSTEANDO en mi BLOG, debido a falta de tiempo, hoy reaparesco posteando y mostrandoles el manejo de un clase muy util llamada: java.awt.Desktop. Esta clase brinda facilidades para poder abrir documentos, editarlos y mandarlos a imprimir facilmente.

En detalle esta clase brinda las siguientes facilidades, pero eso si trabaja con un JDK 1.6, tengan en cuenta eso:

- Desktop.Action.OPEN = Brinda facilidad para abrir un fichero desde JAVA, apoyándose en el software por defecto asigando a ese fichero.
- Desktop.Action.EDIT = Brinda facilidad para editar un fichero desde JAVA, apoyándose en el software por defecto asigando a ese fichero.
- Desktop.Action.PRINT = Brinda facilidad para impresion de un fichero desde JAVA, apoyándose en el software por defecto asigando a ese fichero.
- Desktop.Action.BROWSE = Brinda facilidad para acceder a un URL, apoyándose en el navegador por defecto asigando a ese fichero.

Aqui el ejemplo completo:

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URI;

/**
* @author Cesar Ricardo.
* @clase: TestDesktop.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class ManejoDesktopAWT{

private Desktop desktop = null;
private Desktop.Action action = null;
private File archivo = null;

/**
* main
* @param argumentos
* @throws IOException
*/
public static void main( String[] argumentos ){
ManejoDesktopAWT desktop = new ManejoDesktopAWT();

//Validar que existan en la ruta.
desktop.getUtilProcesarFicheros( "C:\\MI_FOTO.jpg", "ABRIR" );
//desktop.getUtilProcesarFicheros( "C:\\CIBERTEC.gif", "EDITAR" );
//desktop.getUtilProcesarFicheros( "C:\\DOCUMENTO.txt", "IMPRIMIR" );

//desktop.getLinkURL( "http://viviendoconjavaynomoririntentandolo.blogspot.com/" );
}

/**
* getUtilProcesarFicheros este método permite el 'ABRIR, EDITAR y IMPRIMIR' un archivo de cualquier formato en base al
* software por default que tenga asignado.
* 'ABRIR, EDITAR, IMPRIMIR'.
* @param rutaFichero
*/
public void getUtilProcesarFicheros( String rutaFichero, String procesoFichero ){
try{
System.out.println( "SOPORTADO: " + Desktop.isDesktopSupported() );

if( Desktop.isDesktopSupported() == true ){
desktop = Desktop.getDesktop();

archivo = new File( rutaFichero );

if( procesoFichero.equalsIgnoreCase( "ABRIR" ) ){
action = Desktop.Action.OPEN;
}
else if( procesoFichero.equalsIgnoreCase( "EDITAR" ) ){
action = Desktop.Action.EDIT;
}
else if( procesoFichero.equalsIgnoreCase( "IMPRIMIR" ) ){
action = Desktop.Action.PRINT;
}

switch( action ){
case OPEN :
System.out.println( "DENTRO DE OPCION: OPEN" );
desktop.open( archivo );
break;
case EDIT :
System.out.println( "DENTRO DE OPCION: EDIT" );
desktop.edit( archivo );
break;
case PRINT :
System.out.println( "DENTRO DE OPCION: PRINT" );
desktop.print( archivo );
break;
}
}
}
catch( IOException e ){
e.printStackTrace();
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* getLinkURL
* @param url
*/
public void getLinkURL( String url ){

desktop = Desktop.getDesktop();

try{
if( !(desktop.isSupported( Desktop.Action.BROWSE ) == true) ) {

System.err.println( "Desktop no soportar la accion del Navegador." );
System.exit( 1 );
}
else{
URI uri = new URI( url );
desktop.browse( uri );
}
}
catch( Exception e ) {
e.printStackTrace();
}
}
}

Espero les sea de utilidad.
Saludos.