tag:blogger.com,1999:blog-54328188613419895582024-03-12T20:55:29.373-07:00Less is better@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.comBlogger10125tag:blogger.com,1999:blog-5432818861341989558.post-10582331539057478032018-04-27T16:53:00.002-07:002018-04-27T16:53:22.340-07:00Recuperar archivo marcado como archivo bloqueado o virus en Gmail<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
<span style="font-size: large;"><br /></span></div>
<div style="text-align: left;">
Si llegaste a esta página web es por que tienes el mismo problema que me sucedió a mí. Hace mas de un año envié un archivo rar a un amigo, hoy necesitaba esa información y cuando quise descargarla me encontré con el siguiente error.</div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5aS20DQFBcNS3GgQx7BwIi5T_JGPiJ8IGG_ns2YRJSMZ_sahI2rYqgb2W92uIxxjAkkMmdksmd8ZTkpHCNLD2KBXoshshjEx4taxI-B48LO40Km_kGHJBzLdN1fcsMN3VAGnG_TgaoKYJ/s1600/captura_27042018_18-8-52.png" imageanchor="1"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5aS20DQFBcNS3GgQx7BwIi5T_JGPiJ8IGG_ns2YRJSMZ_sahI2rYqgb2W92uIxxjAkkMmdksmd8ZTkpHCNLD2KBXoshshjEx4taxI-B48LO40Km_kGHJBzLdN1fcsMN3VAGnG_TgaoKYJ/s400/captura_27042018_18-8-52.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Opciones para recuperar el archivo</div>
<div>
<ul style="text-align: left;">
<li><b>Usar la app y descargarlo desde el movil. </b></li>
</ul>
<div>
La forma mas sencilla es intentar descargar el archivo desde el teléfono (Android), ahi si esta activa la opción de descarga y agregar a drive.</div>
</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheNr8GXlTjWdcta6e3V6T4dN0-tu-aenEMmKQx_LZ-mF2jkU57iOlxCLbob3yOPYho1SIizvZMiP97FCKZu4i90HAiRu6bkHHoSGcVyVaSSlRYZlXAsOQBHY8aRv7Bq94ssHyzn53qGMkV/s1600/Sin+t%25C3%25ADtulo.png" imageanchor="1"><img border="0" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheNr8GXlTjWdcta6e3V6T4dN0-tu-aenEMmKQx_LZ-mF2jkU57iOlxCLbob3yOPYho1SIizvZMiP97FCKZu4i90HAiRu6bkHHoSGcVyVaSSlRYZlXAsOQBHY8aRv7Bq94ssHyzn53qGMkV/s320/Sin+t%25C3%25ADtulo.png" width="320" /></a></div>
<div>
<ul style="text-align: left;">
<li><b>Descargar mensaje original y abrirlo con Outlook o Thunderbird</b></li>
</ul>
<div>
Esta opción es un poco mas lenta pero te sirve si solo tienes la computadora o si tu teléfono no es android.</div>
</div>
<div>
<br /></div>
<div>
En la ventana donde nos muestra el mensaje buscar la opcion de "Mostrar Original"</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit_0t7B0ke1nFK5upehvAf0fC9VaBMWDSiYouilyZiicmPqN86I5PpGE82EsRXtTTtgaD-p6Ov5q-5Sm73_ulKPqAIbSdKxBHGHB4XZfdhHgDhcGxBQNdB0GnOv-SH27Y5x3kaccd1qGby/s1600/captura_27042018_18-42-1.png" imageanchor="1"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit_0t7B0ke1nFK5upehvAf0fC9VaBMWDSiYouilyZiicmPqN86I5PpGE82EsRXtTTtgaD-p6Ov5q-5Sm73_ulKPqAIbSdKxBHGHB4XZfdhHgDhcGxBQNdB0GnOv-SH27Y5x3kaccd1qGby/s320/captura_27042018_18-42-1.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAASI7owsqYpZtQVvyDpH-Vvzodh0FQiDQvWiSanpTVL_Xu4gO308ukqhy7a_x2wsG-b2vD19iXr88FyNQ-vIw2EZeSCH1QwvSSnNd3BHZgnKsYeRZIL0tUzjCSPTDQ6om9pJeJwn8I-i/s1600/captura_27042018_18-45-8.png" imageanchor="1"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAASI7owsqYpZtQVvyDpH-Vvzodh0FQiDQvWiSanpTVL_Xu4gO308ukqhy7a_x2wsG-b2vD19iXr88FyNQ-vIw2EZeSCH1QwvSSnNd3BHZgnKsYeRZIL0tUzjCSPTDQ6om9pJeJwn8I-i/s320/captura_27042018_18-45-8.png" width="320" /></a></div>
<div>
Usar la opción de <i>Descargar Original</i></div>
<div>
<i><br /></i></div>
<div>
El mensaje se descargará como archivo de texto.</div>
<div>
<i><br /></i></div>
<div>
<i><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWAutTPBKU14qsO11Vb1X9CbgdROSkIWSxLKlJbRTReg9L1P3ceOdRl-9YzUeLuQmTcro0rvfDUeK6xJqiETpaG5UtSnjKH3w37OPSTUtiQaHADgq3kOT2O5nw1b1nTiX4M5jW1_76N0-B/s1600/captura_27042018_18-46-52.png" imageanchor="1"><img border="0" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWAutTPBKU14qsO11Vb1X9CbgdROSkIWSxLKlJbRTReg9L1P3ceOdRl-9YzUeLuQmTcro0rvfDUeK6xJqiETpaG5UtSnjKH3w37OPSTUtiQaHADgq3kOT2O5nw1b1nTiX4M5jW1_76N0-B/s320/captura_27042018_18-46-52.png" width="320" /></a></i></div>
<div>
<br /></div>
<div>
Debemos cambiar la extensión del archivo de txt a eml. Ahora podremos abrirlo y obtener el adjunto con nuestra aplicación de correo predeterminada (Thunderbir, Outlook)</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6p00Vgc1NI6223qUBJu9BZX3-ngT5Ahw6CQ9q44ClsJEdFImAJeex3W8todOJ3AIqseotX5WFt1aIX4zJPaCvAbpVhkvOAAdGI4AXW95u_6P8vWXDt3_-zV7uW4jWsuR2CwZ4sRVlJRZK/s1600/captura_27042018_18-48-38.png" imageanchor="1"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6p00Vgc1NI6223qUBJu9BZX3-ngT5Ahw6CQ9q44ClsJEdFImAJeex3W8todOJ3AIqseotX5WFt1aIX4zJPaCvAbpVhkvOAAdGI4AXW95u_6P8vWXDt3_-zV7uW4jWsuR2CwZ4sRVlJRZK/s320/captura_27042018_18-48-38.png" width="320" /></a></div>
<div>
<br /></div>
<div>
En mi caso use Thunderbird y el adjunto bloqueado aparece al final del correo</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsvaCd5NMIlG3o6rDWA1LHP9fM248MCCLDYrsw9ssVyjseFJZSrrxdwRCHLf3f1APTbkf_DualPxCUr5vl7R9ZUb60ZuvzidvHTzCgL7v5q_O2sMWZirwHeztJV5oSCVJZSzMKP6q9yG8M/s1600/captura_27042018_18-51-42.png" imageanchor="1"><img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsvaCd5NMIlG3o6rDWA1LHP9fM248MCCLDYrsw9ssVyjseFJZSrrxdwRCHLf3f1APTbkf_DualPxCUr5vl7R9ZUb60ZuvzidvHTzCgL7v5q_O2sMWZirwHeztJV5oSCVJZSzMKP6q9yG8M/s320/captura_27042018_18-51-42.png" width="320" /></a></div>
<div>
<br /></div>
<div>
La segunda alternativa parece mas complicada pero solo es por que esta descrita detalladamente. No te lleva mas de 1 minuto.</div>
<div>
<br /></div>
<div>
Espero que les sea útil.</div>
<div>
<i><br /></i></div>
<div>
<br /></div>
<div>
<br /></div>
</div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com0tag:blogger.com,1999:blog-5432818861341989558.post-87177905104895877042013-07-11T12:33:00.001-07:002013-07-11T20:09:04.053-07:00Funciones de Resumen MD5 y SHA en JAVA [aplicado a archivos]<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
El la publicación anterior compartí el código java para generar funciones hash a una cadena utilizando los algoritmos <b>MD2, MD5, SHA-1,SHA-256,SHA-384,SHA-256.</b><br />
<b><br /></b>
Si deseas puedes consultar el post<b> <a href="http://marxs7.blogspot.com/2013/07/funciones-de-resumen-md5-y-sha-en-java.html" target="_blank">Funciones de Resumen MD5 y SHA en JAVA</a> </b>en el cual explico brevemente las funciones hash.<br />
<br />
Para realizar las capturas de pantalla utilizo la aplicación publicada aquí: <b><a href="http://marxs7.blogspot.com/2013/06/aplicacion-java-para-realizar-capturas.html" target="_blank">Aplicacion Java para realizar capturas de pantalla</a>.</b><br />
<b><br /></b>
<b><br /></b>
<b>El código para obtener la cadena hash de un archivo es el siguiente:</b><br />
<b><br /></b>
<span style="color: #274e13;"><i>import java.io.*;</i></span><br />
<span style="color: #274e13;"><i>import javax.crypto.*;</i></span><br />
<span style="color: #274e13;"><i>import javax.crypto.spec.DESKeySpec;</i></span><br />
<span style="color: #274e13;"><i>import java.security.*;</i></span><br />
<span style="color: #274e13;"><i>import java.util.*;</i></span><br />
<span style="color: #274e13;"><i>/*Aplicacion para generar resumenes hash de un archivo</i></span><br />
<span style="color: #274e13;"><i> * @marxs7 Less is better</i></span><br />
<span style="color: #274e13;"><i> * http://marxs7.blogspot.com</i></span><br />
<span style="color: #274e13;"><i> */</i></span><br />
<span style="color: #274e13;"><i>public class HashArchivo</i></span><br />
<span style="color: #274e13;"><i>{</i></span><br />
<span style="color: #274e13;"><i> private static String hash;</i></span><br />
<span style="color: #274e13;"><i> public static String generaHash(String rutaArchivo,String algoritmo)</i></span><br />
<span style="color: #274e13;"><i> {</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> //declarar funcion de resumen</i></span><br />
<span style="color: #274e13;"><i> try{</i></span><br />
<span style="color: #274e13;"><i> MessageDigest messageDigest = MessageDigest.getInstance(algoritmo); // Inicializa con algoritmo seleccionado</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> //leer fichero byte a byte </i></span><br />
<span style="color: #274e13;"><i> try{</i></span><br />
<span style="color: #274e13;"><i> InputStream archivo = new FileInputStream( rutaArchivo );</i></span><br />
<span style="color: #274e13;"><i> byte[] buffer = new byte[1];</i></span><br />
<span style="color: #274e13;"><i> int fin_archivo = -1;</i></span><br />
<span style="color: #274e13;"><i> int caracter;</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> caracter = archivo.read(buffer);</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> while( caracter != fin_archivo ) {</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> messageDigest.update(buffer); // Pasa texto claro a la función resumen</i></span><br />
<span style="color: #274e13;"><i> caracter = archivo.read(buffer);</i></span><br />
<span style="color: #274e13;"><i> } </i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> archivo.close();//cerramos el archivo</i></span><br />
<span style="color: #274e13;"><i> byte[] resumen = messageDigest.digest(); // Genera el resumen </i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> //Pasar los resumenes a hexadecimal</i></span><br />
<span style="color: #274e13;"><i> hash = "";</i></span><br />
<span style="color: #274e13;"><i> for (int i = 0; i < resumen.length; i++)</i></span><br />
<span style="color: #274e13;"><i> {</i></span><br />
<span style="color: #274e13;"><i> hash += Integer.toHexString((resumen[i] >> 4) & 0xf);</i></span><br />
<span style="color: #274e13;"><i> hash += Integer.toHexString(resumen[i] & 0xf);</i></span><br />
<span style="color: #274e13;"><i> }</i></span><br />
<span style="color: #274e13;"><i> // System.out.println("Resumen "+algoritmo+" " + hash);</i></span><br />
<span style="color: #274e13;"><i> }</i></span><br />
<span style="color: #274e13;"><i> //lectura de los datos del fichero</i></span><br />
<span style="color: #274e13;"><i> catch(java.io.FileNotFoundException fnfe) {</i></span><br />
<span style="color: #274e13;"><i> //manejar excepcion archivo no encontrado</i></span><br />
<span style="color: #274e13;"><i> }</i></span><br />
<span style="color: #274e13;"><i> catch(java.io.IOException ioe) {</i></span><br />
<span style="color: #274e13;"><i> //manejar excepcion archivo</i></span><br />
<span style="color: #274e13;"><i> }</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> } </i></span><br />
<span style="color: #274e13;"><i> //declarar funciones resumen</i></span><br />
<span style="color: #274e13;"><i> catch(java.security.NoSuchAlgorithmException nsae) {</i></span><br />
<span style="color: #274e13;"><i> //manejar excepcion algorito seleccionado erroneo</i></span><br />
<span style="color: #274e13;"><i> }</i></span><br />
<span style="color: #274e13;"><i> return hash;//regresamos el resumen</i></span><br />
<span style="color: #274e13;"><i> </i></span><br />
<span style="color: #274e13;"><i> }</i></span><br />
<br />
<span style="color: #274e13;"><i>}</i></span><br />
<span style="color: #274e13;"><i><br /></i></span>
<span style="color: #274e13;"><i><br /></i></span>
A partir de este código podemos generar una interfaz gráfica que nos permita fácilmente obtener el valor MD5 o SHA de un archivo en formato hexadecimal.<br />
<br />
En mi caso la interfaz es la siguiente.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCO1_QO7DlYtcE_NqL94S46tsZbu_ckCgDxLSJF2G82V5na53RnXvTvYxZGluMoEiL4jYagKk95Sd7wg9C4z9Dhoq_Riw7lDJUI21ap8eaGFaeiW327-5ibPZ4sQ3IoxYEfm0NUP2s-r_J/s1600/file2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCO1_QO7DlYtcE_NqL94S46tsZbu_ckCgDxLSJF2G82V5na53RnXvTvYxZGluMoEiL4jYagKk95Sd7wg9C4z9Dhoq_Riw7lDJUI21ap8eaGFaeiW327-5ibPZ4sQ3IoxYEfm0NUP2s-r_J/s320/file2.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8k1zshX6n1I9cMcARs5_TudAQhovJCUwCBwiAzaCgtkNcSvzKz4X-f_HVR70ePjrrdzWV4KJC6sI1t3QYJz9OF4LJP4fzauT75FWI9CZypd0bsIOCHHG-4-KQJT1mXODyyLVGCH04yMX-/s1600/file.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8k1zshX6n1I9cMcARs5_TudAQhovJCUwCBwiAzaCgtkNcSvzKz4X-f_HVR70ePjrrdzWV4KJC6sI1t3QYJz9OF4LJP4fzauT75FWI9CZypd0bsIOCHHG-4-KQJT1mXODyyLVGCH04yMX-/s320/file.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Descarga</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropboxusercontent.com/u/59954534/Aplicaciones/HashArchivo.rar" target="_blank">Proyecto Netbeans</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropboxusercontent.com/u/59954534/Aplicaciones/HashArchivoApp.rar" target="_blank">Aplicacion</a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com1tag:blogger.com,1999:blog-5432818861341989558.post-33646139715236424382013-07-07T17:28:00.004-07:002013-07-08T09:36:23.251-07:00Funciones de Resumen MD5 y SHA en JAVA<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;">A las </span><b style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;">funciones hash </b><span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;"> también se les llama </span><b style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;">funciones picadillo</b><span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;">, </span><b style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;">funciones resumen</b><span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;"> o </span><b style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.1875px;">funciones de digest. </b><span style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23.765625px;">Los </span><strong style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23.765625px;">hash</strong><span style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23.765625px;"> o funciones de resumen son algoritmos que consiguen crear a partir de una entrada (ya sea un texto, una contraseña o un archivo, por ejemplo) una salida alfanumérica de longitud normalmente fija que representa un resumen de toda la información que se le ha dado (es decir, a partir de los datos de la entrada crea una cadena que </span><em style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23.765625px;">solo</em><span style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23.765625px;"> puede volverse a crear con esos mismos datos).</span><br />
<span style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23.765625px;"><br /></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;">Las funciones hash son útiles para almacenar passwords en bases de datos, verificar la integridad de ficheros y también se aplican en procesos de firma digital.</span></span></span><br />
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;">Para generar estas cadenas de resumen utilizaremos la clase MessageDigest de Java.</span></span></span><br />
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;">Los algoritmos que implementaremos son los siguientes:</span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b>*MD2</b></span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b>*MD5</b></span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b>*SHA-1</b></span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b>*SHA-256</b></span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b>*SHA-384</b></span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b>*SHA-512</b></span></span></span><br />
<span style="background-color: white;"><span style="color: purple; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><b><br /></b></span></span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;">En el código a continuación se observa que se crea un arreglo con los diferentes algoritmos. El método generador de hashes es estático y recibe como parámetro la cadena que se va a resumir y un entero que corresponde al indice del arreglo de algoritmos.</span></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span>
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i>import java.io.IOException;</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i>import java.security.MessageDigest;</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i>import java.security.NoSuchAlgorithmException;</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i>/**</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * @author marxs7 Less is better</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> */</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i>public class Hash{</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> //algoritmos</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> public static String[] algoritmos={"MD2","MD5","SHA-1","SHA-256","SHA-384","SHA-512"};</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i><br /></i></span></span>
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> /***</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * Convierte un arreglo de bytes a String usando valores hexadecimales</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * @param digest arreglo de bytes a convertir</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * @return String creado a partir de digest</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> */</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> private static String toHexadecimal(byte[] digest){</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> String hash = "";</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> for(byte aux : digest) {</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> int b = aux & 0xff;</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> if (Integer.toHexString(b).length() == 1) hash += "0";</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> hash += Integer.toHexString(b);</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> }</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> return hash;</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> }</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i><br /></i></span></span>
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> /***</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * Encripta una cadena mediante algoritmo de resumen de mensaje.</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * @param cadena texto a encriptar</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * @param algoritmo algoritmo de encriptacion, puede ser: MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> * @return mensaje encriptado</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> */</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> public static String getHash(String cadena, int tipoAlgoritmo){</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> byte[] digest = null;</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> byte[] buffer = cadena.getBytes();</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> try {</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> MessageDigest messageDigest = MessageDigest.getInstance(algoritmos[tipoAlgoritmo]);</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> messageDigest.reset();</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> messageDigest.update(buffer);</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> digest = messageDigest.digest();</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> } catch (NoSuchAlgorithmException ex) {</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("Error creando Hash");</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> }</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> return toHexadecimal(digest);</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> }</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> //El codigo comentado es solo para probar la funcionalidad.</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> /* public static void main(String[] args){</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("hola"+ " MD2 "+ getHash("hola",0));</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("hola"+ " MD5 "+ getHash("hola",1));</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("hola"+ " SHA-1 "+ getHash("hola",2));</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("hola"+ " SHA-256 "+ getHash("hola",3));</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("hola"+ " SHA-384 "+ getHash("hola",4));</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> System.out.println("hola"+ " SHA-512 "+ getHash("hola",5));</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i> }*/</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i>}</i></span></span><br />
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><span style="font-size: 14px; line-height: 23.765625px;"><i><br /></i></span></span>
<span style="font-size: 14px; line-height: 23.765625px;">A partir de esta clase podemos crear una interfaz para hacer más fácil el uso de esta funcionalidad. En mi caso la aplicación recibe una cadena y al seleccionar algún algoritmo en el combo, muestra la cadena resultante. </span><br />
<span style="font-size: 14px; line-height: 23.765625px;"><br /></span>
<span style="font-size: 14px; line-height: 23.765625px;"><a href="https://dl.dropboxusercontent.com/u/59954534/Aplicaciones/GeneradorHashApp.rar" target="_blank">Descargar Aplicación.</a> 18Kb</span><br />
<span style="font-size: 14px; line-height: 23.765625px;"><a href="https://dl.dropboxusercontent.com/u/59954534/Aplicaciones/GeneradorHash.rar" target="_blank">Descargar Código Fuente. Proyecto NetBeans</a> 37 Kb</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKSViWxtC4YZ0NeLcDoCsdBDDGncMlvwPldX65tpZV80DsuDd7lFEpETAyfkSyJEnSLmohRM7z5HvEAVwWoC3CShaw1gJsyFlIGhJR3ScsLdfIbKLfRylNYLPQq37SgrPtAv7AUTFXPjwX/s1600/hash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKSViWxtC4YZ0NeLcDoCsdBDDGncMlvwPldX65tpZV80DsuDd7lFEpETAyfkSyJEnSLmohRM7z5HvEAVwWoC3CShaw1gJsyFlIGhJR3ScsLdfIbKLfRylNYLPQq37SgrPtAv7AUTFXPjwX/s320/hash.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgn46JQYOd5-niuY0B5CPavfoUuMGxRrkl6bK3OupTIMjd8F5Uo89IklzB99vCB63eGITmIqvvNKKNso3N4d-5A_z3Girf8ncPI4P8QdvN_XIUQtG6teopJ8F7D-8zgwkdm64Ejs3jf-pv/s1600/captura_07072013_19-20-30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgn46JQYOd5-niuY0B5CPavfoUuMGxRrkl6bK3OupTIMjd8F5Uo89IklzB99vCB63eGITmIqvvNKKNso3N4d-5A_z3Girf8ncPI4P8QdvN_XIUQtG6teopJ8F7D-8zgwkdm64Ejs3jf-pv/s320/captura_07072013_19-20-30.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwhQpHZZishOdsv5vwkgH32gv2s453vo5Y7_V6r2R1Juk2Fh8SoyKDCa2ZOJhQTJNsFOgTlR9CBJghW5DneXvM90oWTmbWAOB0pBlLb5ikb235rGTzWHH6xnadOvcGPePchPubb7tj_reB/s1600/md5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwhQpHZZishOdsv5vwkgH32gv2s453vo5Y7_V6r2R1Juk2Fh8SoyKDCa2ZOJhQTJNsFOgTlR9CBJghW5DneXvM90oWTmbWAOB0pBlLb5ikb235rGTzWHH6xnadOvcGPePchPubb7tj_reB/s320/md5.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF-2hCPzZ6tOBHnsjSIMCVeQsL27jYwLUvkJhtcLzp4LG84rxHjlVq1xARUoyidDklHPXIlX6amOdn3_WPJWoI_MKFmqB8oKhw5pZKjKotiFGPK9qRZpj8K4sKXCxjGh3WkqnMSGpCfA6M/s1600/sha-256.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF-2hCPzZ6tOBHnsjSIMCVeQsL27jYwLUvkJhtcLzp4LG84rxHjlVq1xARUoyidDklHPXIlX6amOdn3_WPJWoI_MKFmqB8oKhw5pZKjKotiFGPK9qRZpj8K4sKXCxjGh3WkqnMSGpCfA6M/s320/sha-256.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<span style="font-size: 14px; line-height: 23.765625px;"><br /></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span></span>
<span style="background-color: white;"><span style="color: #333333; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 14px; line-height: 23.765625px;"><br /></span></span></span></div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com3tag:blogger.com,1999:blog-5432818861341989558.post-78246546794604926492013-06-13T23:11:00.001-07:002013-06-13T23:56:23.958-07:00Comprimir y Descomprimir archivos en formato ZIP [JAVA]<br />
<b>Antes de empezar es bueno incluir un poco de información acerca del formato ZIP:</b><br />
<br />
<blockquote class="tr_bq">
<span style="background-color: white;"><i>En <a href="http://es.wikipedia.org/wiki/Inform%C3%A1tica" style="background-image: none; color: #0b0080; text-decoration: none;" title="Informática">informática</a>, <b>ZIP</b> o <b>zip</b> es un <a class="mw-redirect" href="http://es.wikipedia.org/wiki/Formato_de_almacenamiento" style="background-image: none; color: #0b0080; text-decoration: none;" title="Formato de almacenamiento">formato de almacenamiento</a> sin pérdida, muy utilizado para la <a href="http://es.wikipedia.org/wiki/Compresi%C3%B3n_de_datos" style="background-image: none; color: #0b0080; text-decoration: none;" title="Compresión de datos">compresión de datos</a> como documentos, imágenes o programas.</i><i>Para este tipo de archivos se utiliza generalmente la <a class="mw-redirect" href="http://es.wikipedia.org/wiki/Extensi%C3%B3n_de_fichero" style="background-image: none; background-position: initial initial; background-repeat: initial initial; color: #0b0080; text-decoration: none;" title="Extensión de fichero">extensión</a> "<tt style="font-family: monospace, Courier;">.zip</tt>".</i><i>Muchos programas, tanto <a href="http://es.wikipedia.org/wiki/Software_propietario" style="background-image: none; color: #0b0080; text-decoration: none;" title="Software propietario">comerciales</a> como <a href="http://es.wikipedia.org/wiki/Software_libre" style="background-image: none; color: #0b0080; text-decoration: none;" title="Software libre">libres</a>, lo utilizan y permiten su uso más habitual.</i></span></blockquote>
<br />
Considero que junto a el formato <b>rar</b>, son los formatos de compresión de archivos más utilizados. La máquina virtual de Java nos permite el manejo de este tipo de archivos. Con una clase que contenga los métodos de <b>compresión / descompresión </b> podemos realizar fácilmente una aplicación portable y ligera que realice la compresión y descompresión de archivos desde nuestra<b> memoria USB.</b><br />
<b><br /></b>
A continuación podemos ver el código para manejar archivos<b> .ZIP</b><br />
<b><br /></b><span style="color: #38761d;">//Primero importar librerias para manejo de archivos y archivos zip</span><br />
<span style="color: #38761d;">import java.util.zip.*;</span><br />
<span style="color: #38761d;"></span><br />
<span style="color: #38761d;">import java.io.*;</span><br />
<span style="color: #38761d;"><br /></span>
<span style="color: #38761d;">public class ZIP {</span><br />
<br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>private static final int BUFFER_SIZE = 1024;</span><br />
<br />
<span style="color: #38761d;"> public void Comprimir(String archivoOriginal, String archivoZIP) throws Exception {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// bjetos en memoria</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>FileInputStream archivoEntrada = null;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>FileOutputStream archivoSalida = null;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>ZipOutputStream zipos = null;</span><br />
<br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// buffer</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>byte[] buffer = new byte[BUFFER_SIZE];</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>try {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// fichero entrada</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>archivoEntrada = new FileInputStream(archivoOriginal);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>archivoSalida = new FileOutputStream(archivoZIP);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// fichero comprimido</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipos = new ZipOutputStream( archivoSalida);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>ZipEntry zipEntry = new ZipEntry(archivoOriginal);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipos.putNextEntry(zipEntry);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>int len = 0;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// zippear</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>while ((len = archivoEntrada.read(buffer, 0, BUFFER_SIZE)) != -1)</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipos.write(buffer, 0, len);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// volcar la memoria al disco</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipos.flush();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception e) {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>throw e;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>// cerramos los archivos</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipos.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>archivoEntrada.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>archivoSalida.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} // cerramos try.</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} // cerramos Comprimir</span><br />
<br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>public void Descomprimir(String archivoZIP, String archivoDescomprimido) throws Exception {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>BufferedOutputStream bos = null;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>FileInputStream fis = null;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>ZipInputStream zipis = null;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>FileOutputStream fos = null;</span><br />
<br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>try {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fis = new FileInputStream(archivoZIP);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipis = new ZipInputStream(new BufferedInputStream(fis));</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if (zipis.getNextEntry() != null) {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>int len = 0;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>byte[] buffer = new byte[BUFFER_SIZE];</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fos = new FileOutputStream(archivoDescomprimido);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>bos = new BufferedOutputStream(fos, BUFFER_SIZE);</span><br />
<br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>while ((len = zipis.read(buffer, 0, BUFFER_SIZE)) != -1)</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>bos.write(buffer, 0, len);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>bos.flush();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} else {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>throw new Exception("Zip Vacio");</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} // cierra if</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception e) {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>throw e;</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>bos.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>zipis.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fos.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>fis.close();</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} // cierra try</span><br />
<span style="color: #38761d;"></span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>} // cierra descomprimir</span><br />
<span style="color: #38761d;"><br /></span>
Debemos entender que al comprimir ingresamos la ruta del archivo a comprimir como primer parámetro y la ruta del fichero resultante como segundo parámetro. En descomprimir es el orden contrario. Espero haber escrito las variables de manera entendible.<br />
<br />
Para probar el código podemos crear una nueva Main Class o agregar esto al final.<br />
<br />
<span style="color: #38761d;"> ZIP archivo = new ZIP();</span><br />
<span style="color: #38761d;"> String archivoEntrada="</span><span style="color: red;">imagen.jpg</span><span style="color: #38761d;">";//ruta del fichero original </span><br />
<span style="color: #38761d;"> String archivoSalida="</span><span style="color: red;">imagen.zip</span><span style="color: #38761d;">";//ruta del fichero generado</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>archivo.Comprimir(archivoEntrada, archivoSalida);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("Comprimido en zip!");</span><br />
<span style="color: #38761d;"> archivoEntrada="</span><span style="color: red;">imagen.zip</span><span style="color: #38761d;">";//ruta del fichero original </span><br />
<span style="color: #38761d;"> archivoSalida="</span><span style="color: red;">imagen2.jpg</span><span style="color: #38761d;">";//ruta del fichero generado</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>archivo.Descomprimir(archivoEntrada, archivoSalida);</span><br />
<span style="color: #38761d;"><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("ZIP Descomprimido!");</span><br />
<span style="color: #38761d;"><br /></span>
El texto resaltado corresponde a las rutas usadas para probar el programa. Debes colocar una imagen.jpg en tu proyecto al mismo nivel que la carpeta src o simplemente prueba con cualquier otra ruta.<br />
<br />
Próximamente actualizaré la publicación compartiendo una aplicación gráfica que comprima y descomprima los archivos ZIP.<br />
<br />@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com0tag:blogger.com,1999:blog-5432818861341989558.post-77183233916352834862013-06-11T22:46:00.001-07:002013-06-11T23:14:37.971-07:00Aplicación Java para realizar Capturas de Pantalla<br />
<span style="font-family: inherit;">El día de hoy se me ocurrió realizar una aplicación que realizara<b> capturas de pantalla</b>, o impresiones de pantalla y que las exportara a un archivo de imagen<b> jpg, png, gif, bmp,</b> etc</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Investigando un poco encontré información acerca de la clase Robot y entre otras cosas la </span><span style="background-color: white;"><span style="color: #333333; font-family: inherit;"><span style="font-size: 14px; line-height: 17px;">clase nos permite realizar capturas de nuestra pantalla con gran nitidez(</span></span><span style="color: #333333;"><span style="font-size: 14px; line-height: 17px;">también</span></span><span style="color: #333333; font-family: inherit;"><span style="font-size: 14px; line-height: 17px;"> depende del tipo de imagen generado).</span></span></span><br />
<span style="background-color: white;"><span style="color: #333333; font-family: inherit;"><span style="font-size: 14px; line-height: 17px;"><br /></span></span></span>
<br />
<div style="text-align: center;">
<img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRnHYLSE4TTUqgCYUrQXS9C9ncHJjOmHfT52YyFvTwU3tj9joBx" /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
No me extenderé tratando de explicar cada formato de imagen porque no es el objetivo de mi publicación. Pueden jugar con el código y experimentar, para así sacar sus propias conclusiones.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Este es el ejemplo más sencillo para hacer una captura de la pantalla completa.</div>
<div style="text-align: left;">
<br /></div>
<span style="color: #38761d;">import java.awt.AWTException;</span><br />
<span style="color: #38761d;">import java.awt.Rectangle;</span><br />
<span style="color: #38761d;">import java.awt.Robot;</span><br />
<span style="color: #38761d;">import java.awt.Toolkit;</span><br />
<span style="color: #38761d;">import java.awt.image.BufferedImage;</span><br />
<span style="color: #38761d;">import java.io.*;</span><br />
<span style="color: #38761d;">import javax.imageio.ImageIO;</span><br />
<span style="color: #38761d;"><br /></span>
<span style="color: #38761d;">class CapturarPantalla {</span><br />
<span style="color: #38761d;"> public static void main(String args[])</span><br />
<span style="color: #38761d;"> throws AWTException, IOException {</span><br />
<span style="color: #38761d;"> // captura la pantalla completa</span><br />
<span style="color: #38761d;"> BufferedImage pantalla = new Robot().createScreenCapture(</span><br />
<span style="color: #38761d;"> new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );//se obtiene el tamaño de la pantalla</span><br />
<span style="color: #38761d;"> </span><br />
<span style="color: #38761d;"> // Lo guarda como un png, podemos modificarlo y guardarlo como jpg,gif,bmp</span><br />
<span style="color: #38761d;"> </span><span style="color: #990000;"> File file = new File("pantalla.png");</span><span style="color: #38761d;">//creamos el archivo</span><br />
<span style="color: #38761d;"> ImageIO.write(pantalla, "png", file);//escribimos la imagen en archivo</span><span style="color: #38761d;"> </span><br />
<span style="color: #38761d;"> }</span><br />
<span style="color: #38761d;">}</span><br />
<div>
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Como podrán observar el código es muy simple. La linea resaltada en rojo corresponde el lugar donde se guardara el archivo. En este caso se crea en la carpeta principal del proyecto. Es posible escribir cualquier ubicación válida, por ejemplo "d:/pantalla.png", "c:/capturas/pantalla.png", etc.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Si deseamos conocer los formatos de imagen disponibles podemos mostrarlos con el siguiente código.</div>
<span style="color: #38761d;">String writerNames[] = ImageIO.getWriterFormatNames();</span><br />
<span style="color: #38761d;"> for(String aux:writerNames){</span><br />
<span style="color: #38761d;"> System.out.println(aux);</span><br />
<span style="color: #38761d;"> }</span><br />
<span style="color: #38761d;"><br /></span>
Parece una forma muy simple de realizar capturas de pantalla. Pero lo más útil sería que fuera una interfaz gráfica la que te ayudara a realizar esta función. Todo depende de la creatividad e imaginación del programador.<br />
<br />
<b><span style="color: red;">Mi aplicación.</span></b><br />
En mi caso <strike>las interfaces gráficas no son lo mio,</strike> realice una aplicación sencilla que nos permite fácilmente capturar la pantalla o parte de ella y almacenarla en un archivo en múltiples formatos. El único formato que al parecer no me funciono fue <a href="https://www.google.com.mx/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCoQFjAA&url=http%3A%2F%2Fes.wikipedia.org%2Fwiki%2FWireless_Bitmap&ei=sfG3UYjRLu-40gGgj4CQDg&usg=AFQjCNF2-tWIz5sbIcRqkQwrUx0wi1eIsg&sig2=KwJZkgO-Uw2f2V98gVgBCg&bvm=bv.47810305,d.dmQ">wbmp,WBMP</a><br />
<br />
La app tiene un tamaño de 83.4 kb y puedes guardarla en tu memoria usb.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKlptuZwPXIExA8ckrbDsbLvS7uNSiuRTIXcMWkGj9OhdWg0cs4D6c0sOAk7b2Jsc_-t9ACEBBfcFPUa_HwB_mZz7C5y235ISGDbenCmo59tP75ssaDiddu25i0QyCjjV1lIo5sp2RFZmH/s1600/default_11062013_22-58-27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKlptuZwPXIExA8ckrbDsbLvS7uNSiuRTIXcMWkGj9OhdWg0cs4D6c0sOAk7b2Jsc_-t9ACEBBfcFPUa_HwB_mZz7C5y235ISGDbenCmo59tP75ssaDiddu25i0QyCjjV1lIo5sp2RFZmH/s1600/default_11062013_22-58-27.png" height="137" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Al posicionar el cursor sobre los elementos de la aplicación podemos obtener la descripción de sus funciones.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="color: blue;"><b>¿Como funciona?</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
1.-El funcionamiento es muy sencillo, el botón con el icono<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO_cWyH4b9ZZrblsQi9Y8iCPACioZ0dqPshMwO87O6y_-o2jLCOpRfxKZKaIsCInWym-Y4XnUUj166M17tWwpOPY6gzJB6ia-PiJePhhv30NU1dc3HNITVliyINULRBj9XHp_kvlRlxBPk/s1600/icono.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO_cWyH4b9ZZrblsQi9Y8iCPACioZ0dqPshMwO87O6y_-o2jLCOpRfxKZKaIsCInWym-Y4XnUUj166M17tWwpOPY6gzJB6ia-PiJePhhv30NU1dc3HNITVliyINULRBj9XHp_kvlRlxBPk/s1600/icono.jpg" /></a> realiza la captura de pantalla.</div>
<div class="separator" style="clear: both; text-align: left;">
2.-Puedes elegir 2 tipos de capturas:</div>
<div class="separator" style="clear: both; text-align: left;">
<b>a)Pantalla completa:</b> Como su nombre lo dice captura toda la pantalla.</div>
<div class="separator" style="clear: both; text-align: left;">
<b>b)Seleccionado:</b> Captura el área seleccionada. <b>¿Como seleccionar? </b>Cuando se elige "Seleccionado" la ventana permite ser re dimensionada y sirve para capturar el área cubierta por la ventana de la aplicación.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
3.-<b>Tipo de Imagen:</b> Selecciona el formato para exportar la imagen. Puede ser jpg, jpeg,gif,png . La opción predeterminada es <b>png </b>ya que genera imágenes más claras.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
4.- <b>Delay(segundos): </b> Es el tiempo que debe pasar entre ocultar la ventana de aplicación y realizar la captura. Evita que se incluya la ventana de aplicación en la captura. En caso de que aparezcan restos de la ventana se debe aumentar el valor. Si quiere incluir la ventana de la aplicación en la imagen seleccione <b>0</b>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
5.-<b>Guardar en: </b>Su función es elegir la carpeta donde se guarda la imagen. Si no lo define se mostrará <i style="color: purple;">Ubicación de la aplicación. </i>Esto quiere decir que la captura se almacenara en la carpeta donde se ubica la aplicación y se nombrara como captura_11062013_22-58-27.png donde los números significan día,mes, año_hora-minuto-segundo</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
6.-<b>Abrir imagen creada. </b>Esta opción permite que después de generado el archivo se muestre con el visor de imágenes. Si marca la opción se mostrará la imagen, de lo contrario no.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
<br />
Si deseas probar la aplicación puedes descargarla .<br />
<br />
<a href="https://mega.co.nz/#!tpBFhQSR!QSTTKGKdLQ3gtkyRTjwvVz-NNNx1daF14M-Ly0ZknLs" target="_blank">MEGA Screen.rar (54 KB)</a><br />
<a href="https://dl.dropboxusercontent.com/u/59954534/Aplicaciones/Screen.rar" target="_blank">DropBox Screen.rar(54 KB)</a><br />
<a href="http://www.box.com/s/z93wdp10b0jlukll6o89" target="_blank">Box Screen.rar(54 KB)</a><br />
<br />
<div style="text-align: left;">
<br /></div>
<span style="background-color: white;"><span style="color: #333333; font-family: inherit;"><span style="font-size: 14px; line-height: 17px;"><br /></span></span></span>
<span style="background-color: white;"><span style="color: #333333; font-family: inherit;"><span style="font-size: 14px; line-height: 17px;"><br /></span></span></span>@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com3tag:blogger.com,1999:blog-5432818861341989558.post-62629224539297362792013-06-04T18:44:00.002-07:002013-06-04T18:52:45.860-07:00Java Mail (Parte4) Obtener mensajes no leídos de GMail y Yahoo Mail [IMAP]<div dir="ltr" style="text-align: left;" trbidi="on">
El envío de mensajes a través de JavaMail es un proceso de baja complejidad comparado con la lectura de los mensajes de nuestra bandeja de entrada.<br />
<div>
La complejidad es causada porque cuando nosotros enviamos en mensaje especificamos que elementos contiene el cuerpo del mensaje, cuando intentamos leer los mensajes esto es un problema. No sabemos con certeza si el mensaje solo contiene texto, si esta en formato HTML, si contiene uno o mas adjuntos y que tipo de archivos están adjuntados(imágenes, documentos, archivos comprimidos, audio,video,etc)</div>
<div>
<br /></div>
<div>
A continuación presento en código fuente de una clase Java que <b>obtiene los mensajes sin leer</b> de nuestra cuenta de <b>GMail</b> ó <b>Yahoo. </b>Sólo se muestra el texto de los mensajes, en caso de que el mensaje contenga adjuntos no mostrará nada.</div>
<div>
<br /></div>
<div>
Este código es una modificación del que se encuentra en <a href="http://www.mindfiresolutions.com/Retrive-email-from-Yahoo--Gmail-server-using-IMAP-in-JAVA-1244.php">aqui</a>. Para que la aplicación funcione correctamente es necesario importar las librerías disponibles en este <a href="http://marxs7.blogspot.mx/2013/05/enviar-mail-simple-con-javamailparte-1.html">post</a></div>
<div>
<br />
Aclaro que este ejemplo solo muestra los mensajes de tipo texto, si contiene imágenes o archivos adjuntos no se mostrará.<br />
<br />
<span style="color: #134f5c;">import java.util.Properties;</span><br />
<span style="color: #134f5c;">import javax.mail.Flags;</span><br />
<span style="color: #134f5c;">import javax.mail.Folder;</span><br />
<span style="color: #134f5c;">import javax.mail.Message;</span><br />
<span style="color: #134f5c;">import javax.mail.MessagingException;</span><br />
<span style="color: #134f5c;">import javax.mail.NoSuchProviderException;</span><br />
<span style="color: #134f5c;">import javax.mail.Session;</span><br />
<span style="color: #134f5c;">import javax.mail.Store;</span><br />
<span style="color: #134f5c;">import javax.mail.search.FlagTerm;</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;">public class EmailReader {</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> public static void main(String args[]) {</span><br />
<span style="color: #134f5c;"> Properties props = System.getProperties();</span><br />
<span style="color: #134f5c;"> props.setProperty("mail.store.protocol", "imaps");</span><br />
<span style="color: #134f5c;"> try {</span><br />
<span style="color: #134f5c;"> Session session = Session.getDefaultInstance(props, null);</span><br />
<span style="color: #134f5c;"> Store store = session.getStore("imaps");</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> // servidor IMAP para gmail. </span><br />
<span style="color: #134f5c;"> // remplazar <usuario> con su usuario de Gmail.</span><br />
<span style="color: #134f5c;"> // remplazar <password> con el password correspondiente al usuario especificado.</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> store.connect("imap.gmail.com", "usuario@gmail.com", "password");</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> // Servidor IMAP para yahoo.</span><br />
<span style="color: #134f5c;"> //store.connect("imap.mail.yahoo.com", "<username>", "<password>");</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> System.out.println(store);</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> Folder inbox = store.getFolder("Inbox");</span><br />
<span style="color: #134f5c;"> inbox.open(Folder.READ_ONLY);</span><br />
<span style="color: #134f5c;"> mostrarCorreosNoLeidos(inbox);//indicamos que lee los mails no leidos</span><br />
<span style="color: #134f5c;"> </span><br />
<span style="color: #134f5c;"> </span><br />
<span style="color: #134f5c;"> } catch (NoSuchProviderException e) {</span><br />
<span style="color: #134f5c;"> System.out.println(e.toString());</span><br />
<span style="color: #134f5c;"> System.exit(1);</span><br />
<span style="color: #134f5c;"> } catch (MessagingException e) {</span><br />
<span style="color: #134f5c;"> System.out.println(e.toString());</span><br />
<span style="color: #134f5c;"> System.exit(2);</span><br />
<span style="color: #134f5c;"> }</span><br />
<span style="color: #134f5c;"><br /></span>
<span style="color: #134f5c;"> }</span><br />
<span style="color: #134f5c;"> </span><br />
<span style="color: #134f5c;"> static public void mostrarCorreosNoLeidos(Folder inbox){ </span><br />
<span style="color: #134f5c;"> try {</span><br />
<span style="color: #134f5c;"> FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);</span><br />
<span style="color: #134f5c;"> Message msg[] = inbox.search(ft);</span><br />
<span style="color: #134f5c;"> System.out.println("Correos sin leer: "+msg.length);</span><br />
<span style="color: #134f5c;"> for(Message message:msg) {</span><br />
<span style="color: #134f5c;"> try {</span><br />
<span style="color: #134f5c;"> System.out.println("Fecha: "+message.getSentDate().toString());</span><br />
<span style="color: #134f5c;"> System.out.println("De: "+message.getFrom()[0].toString()); </span><br />
<span style="color: #134f5c;"> System.out.println("Asunto: "+message.getSubject().toString());</span><br />
<span style="color: #134f5c;"> System.out.println("Contenido: "+message.getContent().toString());</span><br />
<span style="color: #134f5c;"> System.out.println("******************************************");</span><br />
<span style="color: #134f5c;"> } catch (Exception e) {</span><br />
<span style="color: #134f5c;"> // TODO Auto-generated catch block</span><br />
<span style="color: #134f5c;"> System.out.println("Sin Información");</span><br />
<span style="color: #134f5c;"> }</span><br />
<span style="color: #134f5c;"> }</span><br />
<span style="color: #134f5c;"> } catch (MessagingException e) {</span><br />
<span style="color: #134f5c;"> System.out.println(e.toString());</span><br />
<span style="color: #134f5c;"> }</span><br />
<span style="color: #134f5c;"> }</span><br />
<span style="color: #134f5c;">}</span><br />
<br />
<br />
------------------------------------------------------------------------------------------------------------<br />
Por el momento sigo tratando de entender la estructura de los mensajes para poder leer mensajes complejos en formato HTML y con Archivos adjuntos, espero publicar una entrada en la que explique como realizar la lectura de mensajes complejos.</div>
<div>
</div>
</div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com6tag:blogger.com,1999:blog-5432818861341989558.post-17795156787727146152013-05-25T14:30:00.004-07:002021-02-01T16:16:44.188-08:00JavaMail(Parte 3) Enviar un correo con múltiples destinatarios y múltiples adjuntos.<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
----------------------------------------------------------------------------------------------------<br /><br />
<br /> ----------------------------------------------------------------------------------------------------<br />
En las dos entradas anteriores mostré la forma de <b>enviar un mail y enviar un mail con un archivo adjunto</b>. Los datos a utilizar estaban definidos de forma estática y era simplemente para demostración. En esta ocasión dejo <b>el código que ya he modificado para volverlo más general</b> y se puedan usar variables y parámetros para utilizarlo en una interfaz gráfica.<br />
<br />
A continuación dejo en código.<br />
<br />
<br />
<span style="color: #274e13;">/* @author marxs7</span><br />
<span style="color: #274e13;"> * basado en código de Chuidiang</span><br />
<span style="color: #274e13;"> * En este ejemplo se usa Gmail pero pueden utilizar cualquier servidor</span><br />
<span style="color: #274e13;"> * solo remplacen los valores asignados a servidorSMTP Y puertoEnvio.</span><br />
<span style="color: #274e13;"> */</span><br />
<span style="color: #274e13;">import java.util.Properties;</span><br />
<span style="color: #274e13;">import javax.activation.DataHandler;</span><br />
<span style="color: #274e13;">import javax.activation.FileDataSource;</span><br />
<span style="color: #274e13;">import javax.mail.*;</span><br />
<span style="color: #274e13;">import javax.mail.internet.InternetAddress;</span><br />
<span style="color: #274e13;">import javax.mail.internet.MimeBodyPart;</span><br />
<span style="color: #274e13;">import javax.mail.internet.MimeMessage;</span><br />
<span style="color: #274e13;">import javax.mail.internet.MimeMultipart;</span><br />
<span style="color: #274e13;"><br /></span>
<span style="color: #274e13;">public class EnviarCorreoMejorado</span><br />
<span style="color: #274e13;">{ String miCorreo;</span><br />
<span style="color: #274e13;"> String miPassword;</span><br />
<span style="color: #274e13;"> String servidorSMTP="smtp.gmail.com";</span><br />
<span style="color: #274e13;"> String puertoEnvio="587";// puertoEnvio="587";//465 para mensajes normales y 587 con adjuntos</span><br />
<span style="color: #274e13;"> String[] destinatarios;</span><br />
<span style="color: #274e13;"> String asunto;</span><br />
<span style="color: #274e13;"> String cuerpo = null;//cuerpo del mensaje</span><br />
<span style="color: #274e13;"> String[] archivoAdjunto;</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"> public EnviarCorreoMejorado(String usuario,String pass,String[] dest,String asun,String mens,String[] archivo){</span><br />
<span style="color: #274e13;"> destinatarios=dest;</span><br />
<span style="color: #274e13;"> asunto=asun;</span><br />
<span style="color: #274e13;"> cuerpo=mens;</span><br />
<span style="color: #274e13;"> archivoAdjunto=archivo; </span><br />
<span style="color: #274e13;"> miCorreo=usuario;</span><br />
<span style="color: #274e13;"> miPassword=pass;</span><br />
<span style="color: #274e13;"> }</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"> public void Enviar() throws MessagingException</span><br />
<span style="color: #274e13;"> {</span><br />
<span style="color: #274e13;"> Properties props=null;</span><br />
<span style="color: #274e13;"> props = new Properties();</span><br />
<span style="color: #274e13;"> props.put("mail.smtp.host", servidorSMTP);</span><br />
<span style="color: #274e13;"> props.setProperty("mail.smtp.starttls.enable", "true");//si usa Yahoo comentar esta linea </span><br />
<span style="color: #274e13;"> props.setProperty("mail.smtp.port", "587");</span><br />
<span style="color: #274e13;"> props.setProperty("mail.smtp.user", miCorreo);</span><br />
<span style="color: #274e13;"> props.setProperty("mail.smtp.auth", "true");</span><br />
<span style="color: #274e13;"> SecurityManager security = System.getSecurityManager();</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"> Authenticator auth = new EnviarCorreoMejorado.autentificadorSMTP();</span><br />
<span style="color: #274e13;"> Session session = Session.getInstance(props, auth);</span><br />
<span style="color: #274e13;"> // session.setDebug(true); //Descomentar para ver el proceso de envio detalladamente</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"> // Se compone la parte del texto</span><br />
<span style="color: #274e13;"> BodyPart texto = new MimeBodyPart();</span><br />
<span style="color: #274e13;"> texto.setText(cuerpo);</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"> // Se compone el adjunto </span><br />
<span style="color: #274e13;"> </span><span style="color: #990000;"> BodyPart[] adjunto=new BodyPart[archivoAdjunto.length];</span><br />
<span style="color: #990000;"> for(int j=0;j<archivoAdjunto.length;j++){</span><br />
<span style="color: #990000;"> adjunto[j]=new MimeBodyPart();</span><br />
<span style="color: #990000;"> adjunto[j].setDataHandler(</span><br />
<span style="color: #990000;"> new DataHandler(new FileDataSource(archivoAdjunto[j])));</span><br />
<span style="color: #990000;"> </span><br />
<span style="color: #990000;"> String[] rutaArchivo = archivoAdjunto[j].split("/");//separamos las palabras que forman la url y las ponemos en arreglo de cadenas</span><br />
<span style="color: #990000;"> int nombre=rutaArchivo.length-1;//del array buscamos la ultima posicion</span><br />
<span style="color: #990000;"> adjunto[j].setFileName(rutaArchivo[nombre]);//la ultima posicion debe tener el nombre del archivo</span><br />
<span style="color: #990000;"> }</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"><br /></span>
<span style="color: #274e13;"> // Una MultiParte para agrupar texto e imagen.</span><br />
<span style="color: #274e13;"> MimeMultipart multiParte = new MimeMultipart();</span><br />
<span style="color: #274e13;"> multiParte.addBodyPart(texto);</span><br />
<span style="color: #274e13;"> for(BodyPart aux:adjunto){</span><br />
<span style="color: #274e13;"> multiParte.addBodyPart(aux);</span><br />
<span style="color: #274e13;"> }</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"><br /></span>
<span style="color: #274e13;"> // Se compone el correo, dando to, from, subject y el</span><br />
<span style="color: #274e13;"> // contenido.</span><br />
<span style="color: #274e13;"> MimeMessage message = new MimeMessage(session);</span><br />
<span style="color: #274e13;"> message.setFrom(new InternetAddress(miCorreo));</span><br />
<span style="color: #274e13;"> </span><span style="color: #cc0000;"> Address []destinos = new Address[destinatarios.length];//Aqui usamos el arreglo de destinatarios</span><br />
<span style="color: #cc0000;"> for(int i=0;i<destinos.length;i++){</span><br />
<span style="color: #cc0000;"> destinos[i]=new InternetAddress(destinatarios[i]);</span><br />
<span style="color: #cc0000;"> }</span><br />
<span style="color: #274e13;"> message.addRecipients(Message.RecipientType.TO, destinos);//agregamos los destinatarios</span><br />
<span style="color: #274e13;"> message.setSubject(asunto);</span><br />
<span style="color: #274e13;"> message.setContent(multiParte);</span><br />
<span style="color: #274e13;"><br /></span>
<span style="color: #274e13;"> // Se envia el correo.</span><br />
<span style="color: #274e13;"> Transport t = session.getTransport("smtp");</span><br />
<span style="color: #274e13;"> t.connect(miCorreo, miPassword);</span><br />
<span style="color: #274e13;"> t.sendMessage(message, message.getAllRecipients());</span><br />
<span style="color: #274e13;"> System.out.println("Correo Enviado exitosamente!"); </span><br />
<span style="color: #274e13;"> t.close(); </span><br />
<span style="color: #274e13;"> }</span><br />
<span style="color: #274e13;"> private class autentificadorSMTP extends javax.mail.Authenticator {</span><br />
<span style="color: #274e13;"> public PasswordAuthentication getPasswordAuthentication() {</span><br />
<span style="color: #274e13;"> return new PasswordAuthentication(miCorreo, miPassword);</span><br />
<span style="color: #274e13;"> }</span><br />
<span style="color: #274e13;"> }</span><br />
<span style="color: #274e13;"> </span><br />
<span style="color: #274e13;"> }</span><br />
<span style="color: #274e13;"><br /></span>
<span style="color: #274e13;"><br /></span>
<span style="color: purple;">Cualquier duda o pregunta déjenla en los comentarios. Si necesitan las librerías o servidores y puertos SMTP pueden encontrarlos en la Primer entrada acerca de Java Mail.</span><br />
<span style="color: purple;"><br /></span>
<span style="color: purple;">En la próxima publicación se implementará un parámetro extra para poder definir el servidor de correo dinámicamente.</span><br />
<span style="color: #274e13;"><br /></span></div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com17tag:blogger.com,1999:blog-5432818861341989558.post-46880333967853418182013-05-15T22:44:00.000-07:002013-05-15T22:44:03.538-07:00<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<span style="font-family: Times, Times New Roman, serif;"><b><span style="color: purple; font-size: large;"> JavaMail(Parte 2) </span></b><span style="color: purple; font-size: large;"><b>Enviar un correo con un dato adjunto.</b></span></span></div>
<div style="text-align: center;">
<span style="color: purple; font-size: large;"><b><br /></b></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la publicación anterior realice el envío de un correo electrónico lo mas simple posible. Ahora adaptaremos el código para enviar un correo electrónico con un dato adjunto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Recomiendo que visiten el post anterior para descargar las librerías y leer la explicación acerca del envío de correos electrónicos con JavaMail. <a href="http://marxs7.blogspot.mx/2013/05/enviar-mail-simple-con-javamailparte-1.html">Ir a entrada anterior.</a><br />
<br />
<br />
<br />
import java.util.Properties;<br />
import javax.activation.DataHandler;<br />
import javax.activation.FileDataSource;<br />
import javax.mail.Address;<br />
import javax.mail.Authenticator;<br />
import javax.mail.BodyPart;<br />
import javax.mail.Message;<br />
import javax.mail.MessagingException;<br />
import javax.mail.PasswordAuthentication;<br />
import javax.mail.Session;<br />
import javax.mail.Transport;<br />
import javax.mail.internet.InternetAddress;<br />
import javax.mail.internet.MimeBodyPart;<br />
import javax.mail.internet.MimeMessage;<br />
import javax.mail.internet.MimeMultipart;<br />
/**<br />
* Ejemplo de envio de un correo de texto con una imagen adjunta con javamail<br />
* @author marxs7<br />
*/<br />
public class EnviarCorreoConAdjunto<br />
{ String miCorreo="miCorreo@gmail.com";<br />
String miPassword="miPassword";<br />
String servidorSMTP="smtp.gmail.com";<br />
String puertoEnvio="587";<br />
String destinatario="destinatario@gmail.com";<br />
String asunto="Correo con adjunto";<br />
String mensaje = "mensaje con adjunto desde JAVA";//cuerpo del mensaje<br />
String archivoAdjunto=null;<br />
String nombreArchivo;<br />
<br />
<br />
public EnviarCorreoConAdjunto(String archivo,String nombre){<br />
archivoAdjunto=archivo;<br />
nombreArchivo=nombre;<br />
} <br />
public void Enviar() throws MessagingException<br />
{<br />
<br />
Properties props=null;<br />
props = new Properties();<br />
props.put("mail.smtp.host", servidorSMTP);<br />
//si usan yahoo comentar la linea siguiente<br />
props.setProperty("mail.smtp.starttls.enable", "true");<br />
props.setProperty("mail.smtp.port", "587");<br />
props.setProperty("mail.smtp.user", miCorreo);<br />
props.setProperty("mail.smtp.auth", "true");<br />
<br />
SecurityManager security = System.getSecurityManager();<br />
<br />
<br />
Authenticator auth = new EnviarCorreoConAdjunto.autentificadorSMTP();<br />
Session session = Session.getInstance(props, auth);<br />
// session.setDebug(true);//Descomentar si quieren ver en consola el proceso detallado<br />
<br />
<br />
// Se compone la parte del texto<br />
BodyPart texto = new MimeBodyPart();<br />
texto.setText(mensaje);<br />
BodyPart adjunto = new MimeBodyPart();<br />
adjunto.setDataHandler(new DataHandler(new FileDataSource(archivoAdjunto)));<br />
adjunto.setFileName(nombreArchivo);//es para que al descargar el archivo se<br />
//descargue con el formato correcto<br />
<br />
<br />
// Una MultiParte para agrupar texto e imagen.<br />
MimeMultipart multiParte = new MimeMultipart();<br />
multiParte.addBodyPart(texto);<br />
multiParte.addBodyPart(adjunto);<br />
<br />
MimeMessage message = new MimeMessage(session);<br />
message.setFrom(new InternetAddress(miCorreo));//quien lo envia<br />
message.addRecipient(Message.RecipientType.TO, new InternetAddress(destinatario));//destinatario<br />
message.setSubject(asunto);//asunto<br />
message.setContent(multiParte);//asignamos los datos al mensaje<br />
<br />
// Se envia el correo.<br />
Transport t = session.getTransport("smtp");<br />
t.connect(miCorreo, miPassword);<br />
t.sendMessage(message, message.getAllRecipients());<br />
//System.out.println("Correo Enviado exitosamente!");<br />
t.close();<br />
<br />
<br />
}<br />
private class autentificadorSMTP extends javax.mail.Authenticator {<br />
public PasswordAuthentication getPasswordAuthentication() {<br />
return new PasswordAuthentication(miCorreo, miPassword);<br />
}<br />
}<br />
<br />
public static void main(String[] args) throws MessagingException {<br />
// TODO Auto-generated method stub<br />
EnviarCorreoConAdjunto EnviarAdjunto = new EnviarCorreoConAdjunto("c:/imagen.gif",<br />
"imagen.gif");<br />
EnviarAdjunto.Enviar();<br />
<br />
System.out.println("Mensaje Enviado");<br />
}<br />
}<br />
</div>
<div style="text-align: justify;">
<br />
Esta en la base para el envío de correos electrónicos con datos adjuntos. Podemos adecuar el código expuesto de acuerdo a nuestras necesidades. Este ejemplo es demasiado sencillo solo es para comprender mejor la estructura. Cada persona puede predefinir los parámetros que le convenga.<br />
Si desean crear una interfaz gráfica solo modifiquen el constructor para que acepte los parámetros que consideren necesarios.<br />
<br />
En la próxima entrada explicaré la forma de enviar un correo electrónico con múltiples datos adjuntos a múltiples destinatarios.</div>
</div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com0tag:blogger.com,1999:blog-5432818861341989558.post-49461703793224716152013-05-15T14:41:00.000-07:002013-05-15T21:42:08.134-07:00<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<b><span style="color: purple; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: large;"> JavaMail(Parte 1) </span></b><b><span style="color: purple; font-family: Helvetica Neue, Arial, Helvetica, sans-serif; font-size: large;">Enviar Mail Simple</span></b></div>
<div>
<b><span style="color: purple; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></b></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Hoy comienzo un pequeño tutorial para <b>enviar correos electrónicos</b> desde una aplicación en <b>Java</b>. Explicare desde enviar un mensaje simple desde una cuenta predeterminada hasta como enviar un correo a múltiples destinatarios, con múltiples adjuntos con detección de servidores de correo mas utilizados.</span></div>
<div>
<br /></div>
<div>
Que necesitamos:</div>
<div>
Obviamente contar con el JDK instalado en el equipo.</div>
<div>
Librerias <a href="https://docs.google.com/file/d/0BzUDl3KyrMWkRDZNd3VPRG9BT2c/edit?usp=sharing">JavaMail </a></div>
<div>
NetBeans(Para las interfaces gráficas).</div>
<div>
<br /></div>
<div>
Los datos necesarios para enviar un email son los siguientes:</div>
<div>
<ul style="text-align: left;">
<li><b><span style="color: blue;">Servidor SMTP.</span></b> Direccion SMTP de su proveedor de Correos.</li>
<li><b><span style="color: blue;">Puerto del Servidor SMTP.</span></b> El puerto en el cual nos conectaremos.</li>
<li><b><span style="color: blue;">Usuario.</span></b> El usuario para conectarnos al Servidor SMTP.</li>
<li><span style="color: blue;"><b>Password.</b></span> La contraseña.</li>
<li><b><span style="color: blue;">Destinatario.</span></b> Las personas a las que va dirigido el mensaje.</li>
<li><strike>Destinatario para copia. </strike></li>
<li><strike>Destinatario para copia oculta.</strike></li>
<li><span style="color: blue;"><b>Asunto.</b></span> El asunto del mensaje.</li>
<li><span style="color: blue;"><b>Mensaje.</b></span> Es la información que queremos enviar.</li>
<li><span style="color: blue;"><b>Adjuntos.</b></span> Los archivos que se enviarán junto al mensaje.</li>
</ul>
<div>
<br /></div>
</div>
<div>
<b>Lista de Servidores SMTP.</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW82Iyp0oaFQtftHLTCrOo5eeXsaHbAN4fNRse_HZveDqBTvNurzqMi8QgZ39Z6P8KMm30C-CJXpBc1jrn-oXHhdfBWrfbyTN9olPGU8zNhLweTjv8EkUAPokd_GoyJ8bq0yy0zo8tBZU5/s1600/descarga+(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW82Iyp0oaFQtftHLTCrOo5eeXsaHbAN4fNRse_HZveDqBTvNurzqMi8QgZ39Z6P8KMm30C-CJXpBc1jrn-oXHhdfBWrfbyTN9olPGU8zNhLweTjv8EkUAPokd_GoyJ8bq0yy0zo8tBZU5/s1600/descarga+(1).jpg" /></a></div>
<div style="text-align: center;">
<b><br /></b></div>
<div>
<b><br /></b></div>
<div>
<b>GMail</b></div>
<div>
Servidor <span style="color: #cc0000;">SMTP: smtp.gmail.com</span></div>
<div>
Puerto: <span style="color: #cc0000;">465,587 (según mis pruebas 465 para mensajes normales y 587 para mensajes con aduntos)</span></div>
<div>
<br /></div>
<div>
<div>
<b>HotMail, Live, Outlook</b></div>
<div>
Servidor SMTP: <span style="color: #cc0000;">smtp.live.com</span></div>
<div>
Puerto: <span style="color: #cc0000;">587</span></div>
</div>
<div>
<br /></div>
<div>
<div>
<b> Yahoo Mail</b></div>
<div>
Servidor SMTP:<span style="color: #cc0000;">smtp.mail.yahoo.com</span></div>
<div>
Puerto:<span style="color: #cc0000;">587</span></div>
</div>
<div>
<br /></div>
<div>
Después de aclarar lo necesario, las partes que contiene un correo electrónico y los servidores SMTP mas utilizados crearemos el ejemplo más sencillo. En este ejemplo todos los datos están definidos y solo debemos ejecutar el código.</div>
<div>
<br /></div>
<div>
<b>Remplazar por su usuario, contraseña y destinatario para que funcione.</b></div>
<div>
<br />
-------Recuerden importar las librerías al proyecto----------</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br />
import java.util.Properties;<br />
import javax.mail.*;<br />
import javax.mail.internet.InternetAddress;<br />
import javax.mail.internet.MimeMessage;<br />
<br />
public class EnviarCorreo {<br />
final String miCorreo = "ejemplo@gmail.com";<br />
final String miContraseña = "miPassword";<br />
final String servidorSMTP = "smtp.gmail.com";<br />
final String puertoEnvio = "465";<br />
String mailReceptor = null;<br />
String asunto = null;<br />
String cuerpo = null;<br />
<br />
public EnviarCorreo(String mailReceptor, String asunto,<br />
String cuerpo) throws MessagingException {<br />
this.mailReceptor = mailReceptor;<br />
this.asunto = asunto;<br />
this.cuerpo = cuerpo;<br />
<br />
Properties props = new Properties();<br />
props.put("mail.smtp.user", miCorreo);<br />
props.put("mail.smtp.host", servidorSMTP);<br />
props.put("mail.smtp.port", puertoEnvio);<br />
props.put("mail.smtp.starttls.enable", "true");<br />
props.put("mail.smtp.auth", "true");<br />
props.put("mail.smtp.socketFactory.port", puertoEnvio);<br />
props.put("mail.smtp.socketFactory.class",<br />
"javax.net.ssl.SSLSocketFactory");<br />
props.put("mail.smtp.socketFactory.fallback", "false");<br />
<br />
SecurityManager security = System.getSecurityManager();<br />
<br />
<br />
Authenticator auth = new EnviarCorreo.autentificadorSMTP();<br />
Session session = Session.getInstance(props, auth);<br />
// session.setDebug(true);<br />
<br />
MimeMessage msg = new MimeMessage(session);<br />
msg.setText(cuerpo);<br />
msg.setSubject(asunto);<br />
msg.setFrom(new InternetAddress(miCorreo));<br />
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(<br />
mailReceptor));<br />
Transport.send(msg);<br />
<br />
<br />
}<br />
<br />
private class autentificadorSMTP extends javax.mail.Authenticator {<br />
public PasswordAuthentication getPasswordAuthentication() {<br />
return new PasswordAuthentication(miCorreo, miContraseña);<br />
}<br />
}<br />
<br />
/**<br />
* @param args<br />
*/<br />
public static void main(String[] args) throws MessagingException {<br />
// TODO Auto-generated method stub<br />
//El destinatario puede ser cualquier direccion electronica válida<br />
EnviarCorreo EnviadorMail = new EnviarCorreo("destinatario@gmail.com",<br />
"Asunto", "Mensaje ");<br />
System.out.println("Mensaje Enviado");<br />
}<br />
<br />
}</div>
<div>
<br /></div>
<div>
<br />
En la siguiente publicación Explicare como enviar un <b>Correo Con datos Adjuntos.</b></div>
</div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com0tag:blogger.com,1999:blog-5432818861341989558.post-72178728001082339842013-05-12T22:11:00.001-07:002013-05-12T22:16:30.555-07:00<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<b><span style="color: purple; font-family: Trebuchet MS, sans-serif; font-size: large;">Mi primer publicación</span></b></div>
<div style="text-align: center;">
<b><span style="color: purple; font-family: Trebuchet MS, sans-serif; font-size: large;"><br /></span></b></div>
<div style="text-align: left;">
<b><span style="color: purple; font-family: Trebuchet MS, sans-serif; font-size: large;"><br /></span></b></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Mi primer publicación la enfocaré a presentarme, a contarles quien soy y que hago :)</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Realmente no creí que fuera tan difícil describirse. Normalmente soy una persona que se platica mucho con sus amigos y se la pasa riendo todo el tiempo.</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Soy un estudiante universitario, estudio Licenciatura en Informática. Me gusta mucho la tecnología y sobre todo los teléfonos. </span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Otra actividad que me gusta es la programación principalmente en Java y siempre estoy buscando código y buscando nuevas formas de utilizarlo.</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><b>El porque del titulo del blog.</b></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Less is Better, es una frase en inglés que en español equivale a <b>Menos es mejor. </b>Escogí este titulo debido a que pienso escribir algunos tutoriales simples que sean lo mas cortos posible y bien explicado para su mejor comprensión.</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">En fin se que pocos o tal vez nadie lea esta publicación así que mejor me esforzaré en mis publicaciones siguientes.</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Espero que les agrade el contenido de mi blog. Y cualquier duda la responderé oportunamente.</span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: center;">
<b>ATTE </b></div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: center;">
<b>Marxs7</b></div>
</div>
@marxs7http://www.blogger.com/profile/13989636822654232507noreply@blogger.com0