<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Consultoría informática: obras selectas &#187; Java</title>
	<atom:link href="http://xand.es/category/java/feed" rel="self" type="application/rss+xml" />
	<link>http://xand.es</link>
	<description>¿Tonterías? Todas las que quieras</description>
	<lastBuildDate>Tue, 18 May 2010 19:54:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Paginación en Java</title>
		<link>http://xand.es/paginacion-en-java_20100320</link>
		<comments>http://xand.es/paginacion-en-java_20100320#comments</comments>
		<pubDate>Sat, 20 Mar 2010 11:28:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=311</guid>
		<description><![CDATA[Muchas veces lo que se necesita es implementar la paginación en Java. Tengo una forma genérica en implementar cualquier tipo de paginación en cualquier sitio. Sin cargar mucho la base de datos, ni utilizar mucha memoria una vez que se devuelven los datos. Supongamos que tenemos una tabla con muchos registros (100 000, por ejemplo) [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces lo que se necesita es implementar la paginación en Java. Tengo una forma genérica en implementar cualquier tipo de paginación en cualquier sitio. Sin cargar mucho la base de datos, ni utilizar mucha memoria una vez que se devuelven los datos. Supongamos que tenemos una tabla con muchos registros (100 000, por ejemplo) y queremos mostrarle a los usuarios 1 000 páginas con 100 registros por página.</p>
<p>Pongo un ejemplo genérico para un Servlet, pero en los demás casos la situación sería parecida.</p>
<div class="java">
<table border="0" cellspacing="0" cellpadding="3" bgcolor="#ffffff">
<tbody>
<tr><!-- start source code --></p>
<td align="left" valign="top"><code><br />
<span style="color: #7f0055;"><strong>public class </strong></span><span style="color: #000000;">PaginacionServlet </span><span style="color: #7f0055;"><strong>extends </strong></span><span style="color: #000000;">HttpServlet </span><span style="color: #000000;">{</span></code></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>private static final </strong></span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">REGISTROS_POR_PAGINA = </span><span style="color: #990000;">100</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>private </strong></span><span style="color: #000000;">SqlMapClient SQL;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>protected </strong></span><span style="color: #7f0055;"><strong>void </strong></span><span style="color: #000000;">doGet</span><span style="color: #000000;">(</span><span style="color: #000000;">HttpServletRequest request, HttpServletResponse response</span><span style="color: #000000;">) </span><span style="color: #7f0055;"><strong>throws </strong></span><span style="color: #000000;">ServletException, IOException </span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// para simplificar todo va dentro de bloque try..catch</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo la cantidad de contactos en todas las páginas</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>try </strong></span><span style="color: #000000;">{</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo el total de las entradas que tenemos</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">total = </span><span style="color: #000000;">(</span><span style="color: #000000;">Integer</span><span style="color: #000000;">)</span><span style="color: #000000;">SQL.queryForObject</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo la cantidad de páginas total que vamos a mostrar al usuario</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">mod = total % REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">diff = total - mod;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">totalPaginas = diff / REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>if</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">mod != </span><span style="color: #990000;">0</span><span style="color: #000000;">) </span><span style="color: #3f7f5f;">// si la división no es exacta habrá una página más</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">totalPaginas++;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// obtengo la página actual en la que estamos</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">String sPage = request.getParameter</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;p&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">page = </span><span style="color: #990000;">0</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// si no está presente el parámetro asumo que estamos en la página cero (la primera)</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>if</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">sPage != </span><span style="color: #7f0055;"><strong>null</strong></span><span style="color: #000000;">) {</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">page = Integer.parseInt</span><span style="color: #000000;">(</span><span style="color: #000000;">sPage</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">page&#8211;;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// calculo el límite y el offset que pasaremos a la BBDD en la consulta</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">offset = page * REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">limit = REGISTROS_POR_PAGINA;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// la página actual &#8221;de cara al usuario&#8221;</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">paginaActual = page + </span><span style="color: #990000;">1</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// el usuario empieza a contar de 1, no de 0</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">paginaAnterior = page; </span><span style="color: #3f7f5f;">// aquí se debería de controlar el valor de 0</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #7f0055;"><strong>int </strong></span><span style="color: #000000;">paginaSiguiente = page + </span><span style="color: #990000;">2</span><span style="color: #000000;">; </span><span style="color: #3f7f5f;">// la misma razón</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #3f7f5f;">// en la lista objects estará lo que queremos</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">List objects = SQL.queryForList</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;queryConElLimitYElOffsetPuestos&#8221;</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span></p>
<p><span style="color: #ffffff;"> </span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span><span style="color: #7f0055;"><strong>catch</strong></span><span style="color: #000000;">(</span><span style="color: #000000;">Exception e</span><span style="color: #000000;">){}</span></p>
<p><span style="color: #ffffff;"> </span><span style="color: #000000;">}</span></p>
<p><span style="color: #000000;">}</span></td>
<p><!-- end source code --></tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/paginacion-en-java_20100320/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Codificaciones en los servlets</title>
		<link>http://xand.es/codificaciones-en-los-servlets_20100318</link>
		<comments>http://xand.es/codificaciones-en-los-servlets_20100318#comments</comments>
		<pubDate>Thu, 18 Mar 2010 12:57:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=306</guid>
		<description><![CDATA[Muchas veces, cuando trabajamos con caractéres que no están en la tabla ASCII (castellano incluído) pueden surgir problemas a la hora de tratar las cadenas en los servlets. Por ejemplo, muchas veces aparecen caractéres extraños en vez de las eñes, letras acentuadas, etc. La forma más sencilla de evitar esto es trabajar con UTF-8 (Unicode) [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces, cuando trabajamos con caractéres que no están en la tabla ASCII (castellano incluído) pueden surgir problemas a la hora de tratar las cadenas en los servlets. Por ejemplo, muchas veces aparecen caractéres extraños en vez de las eñes, letras acentuadas, etc. La forma más sencilla de evitar esto es trabajar con UTF-8 (Unicode) a todos los niveles. Para lograrlo basta con seguir unas simples reglas a la hora de enviar los formularios:</p>
<ol>
<li>En la página HTML desde la que se envía el formulario hay que poner el meta, exactamente: <strong><em>&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=UTF-8&#8243;&gt;</em></strong></li>
<li>En el servlet que trata la página enviada, <strong>la primera (esto es super-importante) llamada</strong> tiene que ser: <strong><em>request.setCharacterEncoding(&#8220;UTF-8&#8243;);</em></strong></li>
<li>No estaría demás (pero no es obligatorio) incluir en la página HTML el tipo de documento que es, por ejemplo: <strong><em>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;.</em></strong></li>
</ol>
<p>Siguiendo estas sencillas reglas se puede evitar muchos quebraderos de cabeza.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/codificaciones-en-los-servlets_20100318/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java2HTML &#8212; una utilidad para colorear Java</title>
		<link>http://xand.es/java2html-una-utilidad-para-colorear-java_20090817</link>
		<comments>http://xand.es/java2html-una-utilidad-para-colorear-java_20090817#comments</comments>
		<pubDate>Mon, 17 Aug 2009 18:43:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Descargas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=159</guid>
		<description><![CDATA[Ya que siempre estoy poniendo el código en estas páginas voy a pensar más en los usuarios que lean esto. He encontrado una utilidad muy buena llamada Java2HTML. Se puede instalar o bien como una aplicación aparte o bien como un plugin de Eclipse. Colorea el código bastante bien (podeis ver ejemplos en este mismo [...]]]></description>
			<content:encoded><![CDATA[<p>Ya que siempre estoy poniendo el código en estas páginas voy a pensar más en los usuarios que lean esto. He encontrado una utilidad muy buena llamada <strong>Java2HTML</strong>. Se puede instalar o bien como una aplicación aparte o bien como un <strong>plugin de Eclipse</strong>. <strong>Colorea el código</strong> bastante bien (podeis ver ejemplos en este mismo blog) y es muy sencilla de instalar, aquí dejo los enlaces:</p>
<p><a href="http://www.java2html.com">Java2HTML</a> &#8212; aplicación standalone.<br />
<a href="http://www.java2html.de/eclipse.html">Java2HTML</a> &#8212; plugin para Eclipse (probado con Ganymede).</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/java2html-una-utilidad-para-colorear-java_20090817/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejecutar comandos Linux desde Java (II)</title>
		<link>http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817</link>
		<comments>http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817#comments</comments>
		<pubDate>Mon, 17 Aug 2009 18:11:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=147</guid>
		<description><![CDATA[La primera parte se encuentra aquí.
En la entrada anterior vimos un ejemplo sencillo sobre cómo podíamos ejecutar un comando externo desde el código Java. Voy a intentar construir algo más complejo que esto, concretamente me interesa hacer una clase que pueda lanzar un comando Linux sin bloquear el hilo que lo origina. Es decir, lanzar [...]]]></description>
			<content:encoded><![CDATA[<p>La primera parte se encuentra <a href="http://xand.es/ejecutar-comandos-linux-desde-java_20090816">aquí</a>.</p>
<p>En la entrada anterior vimos un ejemplo sencillo sobre cómo podíamos <strong>ejecutar un comando externo desde el código Java</strong>. Voy a intentar construir algo más complejo que esto, concretamente me interesa hacer una clase que pueda <strong>lanzar un comando Linux sin bloquear el hilo</strong> que lo origina. Es decir, <strong>lanzar un comando como si fuera un Thread</strong> más de la máquina virtual.</p>
<p>La forma más sencilla que conozco para hacerlo sin ningún tipo de bloqueos es mediante un <strong>Listener</strong>. A mi me interesa <strong>ver en tiempo real la STDOUT y STDERR del comando externo</strong>. También quiero saber cuando acaba y cuál es el código de salida. Construyo una interfaz:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#7f0055"><b>public&nbsp;interface&nbsp;</b></font><font color="#000000">ProcessListener&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;se&nbsp;llama&nbsp;cuando&nbsp;se&nbsp;actualiza&nbsp;la&nbsp;salida&nbsp;est&aacute;ndar</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">updateStdOut</font><font color="#000000">(</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;se&nbsp;llama&nbsp;cuando&nbsp;se&nbsp;actualiza&nbsp;StdErr</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">updateStdErr</font><font color="#000000">(</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;se&nbsp;llama&nbsp;cuando&nbsp;el&nbsp;proceso&nbsp;termina</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">processFinish</font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">exitCode,&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdOut,&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdErr</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Esta será la interfaz que implementaremos en una clase que será la responsable de realizar ciertas operaciones en función de las distintas salidas del comando exterior. Ahora necesitamos una clase que será la encargada de lanzar el proceso propiamente dicho:</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#7f0055"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">ProcessLauncher&nbsp;</font><font color="#7f0055"><b>implements&nbsp;</b></font><font color="#000000">Runnable&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">String&nbsp;Command;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">ExitCode&nbsp;=&nbsp;Integer.MIN_VALUE;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Thread&nbsp;MyThread;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Vector&nbsp;StdOut;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Vector&nbsp;StdErr;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">ProcessListener&nbsp;MyProcessListener;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Object&nbsp;Lock&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Object</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Process&nbsp;MyProcess;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">ProcessLauncher</font><font color="#000000">(</font><font color="#000000">String&nbsp;command,&nbsp;ProcessListener&nbsp;pl</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Command&nbsp;=&nbsp;command;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener&nbsp;=&nbsp;pl;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdOut&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Vector</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdErr&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Vector</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Thread</font><font color="#000000">(</font><font color="#7f0055"><b>this</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread.start</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>boolean&nbsp;</b></font><font color="#000000">isFinished</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">ExitCode&nbsp;!=&nbsp;Integer.MIN_VALUE;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">run</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;arranco&nbsp;el&nbsp;proceso</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcess&nbsp;=&nbsp;startProcess</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;creo&nbsp;un&nbsp;controlador&nbsp;del&nbsp;proceso</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ProcessController&nbsp;pc&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">ProcessController</font><font color="#000000">(</font><font color="#000000">MyProcess,&nbsp;</font><font color="#7f0055"><b>this</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;ahora&nbsp;hasta&nbsp;que&nbsp;no&nbsp;finalice&nbsp;el&nbsp;m&eacute;todo&nbsp;voy&nbsp;leyendo&nbsp;la&nbsp;salida</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>while</b></font><font color="#000000">(</font><font color="#000000">ExitCode&nbsp;==&nbsp;Integer.MIN_VALUE</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>synchronized</b></font><font color="#000000">(</font><font color="#000000">Lock</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;de&nbsp;esta&nbsp;forma&nbsp;me&nbsp;aseguro&nbsp;que&nbsp;nadie&nbsp;m&aacute;s&nbsp;est&aacute;&nbsp;leyendo&nbsp;la&nbsp;salida</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">readStreams</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Thread.sleep</font><font color="#000000">(</font><font color="#990000">500</font><font color="#000000">)</font><font color="#000000">;&nbsp;</font><font color="#3f7f5f">//&nbsp;duermo&nbsp;un&nbsp;poco&nbsp;para&nbsp;liberar&nbsp;los&nbsp;recursos</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><font color="#7f0055"><b>catch</b></font><font color="#000000">(</font><font color="#000000">Exception&nbsp;e</font><font color="#000000">){</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">readStreams</font><font color="#000000">()&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InputStream&nbsp;stdout&nbsp;=&nbsp;MyProcess.getInputStream</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InputStream&nbsp;stderr&nbsp;=&nbsp;MyProcess.getErrorStream</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">b;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">size;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">size&nbsp;=&nbsp;stdout.available</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if</b></font><font color="#000000">(</font><font color="#000000">size&nbsp;!=&nbsp;</font><font color="#990000">0</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">b&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">size</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stdout.read</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener.updateStdOut</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;b.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdOut.add</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">])</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">size&nbsp;=&nbsp;stderr.available</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>if</b></font><font color="#000000">(</font><font color="#000000">size&nbsp;!=&nbsp;</font><font color="#990000">0</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">b&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">size</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stderr.read</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener.updateStdErr</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;b.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">StdErr.add</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">])</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Process&nbsp;startProcess</font><font color="#000000">()&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Process&nbsp;proc&nbsp;=&nbsp;Runtime.getRuntime</font><font color="#000000">()</font><font color="#000000">.exec</font><font color="#000000">(</font><font color="#000000">Command</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>return&nbsp;</b></font><font color="#000000">proc;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">notifyExit</font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">exitCode</font><font color="#000000">)&nbsp;</font><font color="#7f0055"><b>throws&nbsp;</b></font><font color="#000000">Exception&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;me&nbsp;notifican&nbsp;que&nbsp;se&nbsp;el&nbsp;proceso&nbsp;se&nbsp;ha&nbsp;terminado</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ExitCode&nbsp;=&nbsp;exitCode;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;leo&nbsp;por&nbsp;&uacute;ltima&nbsp;vez&nbsp;las&nbsp;salidas,&nbsp;por&nbsp;si&nbsp;se&nbsp;ha&nbsp;quedado&nbsp;algo</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>synchronized&nbsp;</b></font><font color="#000000">(</font><font color="#000000">Lock</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">readStreams</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;notifico&nbsp;al&nbsp;listener</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdOut&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">StdOut.size</font><font color="#000000">()]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;stdOut.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stdOut</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;</font><font color="#000000">((</font><font color="#000000">Byte</font><font color="#000000">)</font><font color="#000000">StdOut.get</font><font color="#000000">(</font><font color="#000000">i</font><font color="#000000">))</font><font color="#000000">.byteValue</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>byte</b></font><font color="#000000">[]&nbsp;</font><font color="#000000">stdErr&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#7f0055"><b>byte</b></font><font color="#000000">[</font><font color="#000000">StdErr.size</font><font color="#000000">()]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;stdErr.length;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">stdErr</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;</font><font color="#000000">((</font><font color="#000000">Byte</font><font color="#000000">)</font><font color="#000000">StdErr.get</font><font color="#000000">(</font><font color="#000000">i</font><font color="#000000">))</font><font color="#000000">.byteValue</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessListener.processFinish</font><font color="#000000">(</font><font color="#000000">exitCode,&nbsp;stdOut,&nbsp;stdErr</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>Esta clase se encargará de <strong>leer periodicamente los flujos de salida del proceso</strong> e ir tanto guardándolo en memoria como pasándolo al Listener en tiempo real. Pero claro, aquí nos encontramos con otra dificultad y es que resulta que queremos saber a ciencia cierta y en el momento exacto cuando termina nuestro proceso, para ello definimos un controlador de proceso (ProcessController):</p>
<div align="left" class="java">
<table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
<tr>
  <!-- start source code --></p>
<td nowrap="nowrap" valign="top" align="left">
    <code><br />
<font color="#7f0055"><b>public&nbsp;class&nbsp;</b></font><font color="#000000">ProcessController&nbsp;</font><font color="#7f0055"><b>implements&nbsp;</b></font><font color="#000000">Runnable&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Process&nbsp;MyProcess;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">Thread&nbsp;MyThread;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>private&nbsp;</b></font><font color="#000000">ProcessLauncher&nbsp;MyProcessLauncher;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#000000">ProcessController</font><font color="#000000">(</font><font color="#000000">Process&nbsp;proc,&nbsp;ProcessLauncher&nbsp;pl</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcess&nbsp;=&nbsp;proc;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessLauncher&nbsp;=&nbsp;pl;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread&nbsp;=&nbsp;</font><font color="#7f0055"><b>new&nbsp;</b></font><font color="#000000">Thread</font><font color="#000000">(</font><font color="#7f0055"><b>this</b></font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyThread.start</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><b>public&nbsp;</b></font><font color="#7f0055"><b>void&nbsp;</b></font><font color="#000000">run</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>try&nbsp;</b></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><b>int&nbsp;</b></font><font color="#000000">code&nbsp;=&nbsp;MyProcess.waitFor</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;notificar&nbsp;al&nbsp;padre</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyProcessLauncher.notifyExit</font><font color="#000000">(</font><font color="#000000">code</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><font color="#7f0055"><b>catch</b></font><font color="#000000">(</font><font color="#000000">Exception&nbsp;e</font><font color="#000000">){</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code></p>
</td>
<p>  <!-- end source code --><br />
   </tr>
</table>
</div>
<p>El objeto de esta clase se ejecutará en un hilo aparte que se quedará <strong>bloqueado hasta que el proceso termine</strong>. En cuanto termina el proceso el código de salida es comunicado a ProcessLauncher para que este pueda tomar las acciones oportunas. Para la próxima vez pondré ejemplos de utilización y si me da tiempo prepararé un <strong>JAR</strong> para que se pueda bajar y usar tranquilamente como si fuera una librería.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ejecutar comandos Linux desde Java (I)</title>
		<link>http://xand.es/ejecutar-comandos-linux-desde-java_20090816</link>
		<comments>http://xand.es/ejecutar-comandos-linux-desde-java_20090816#comments</comments>
		<pubDate>Sun, 16 Aug 2009 11:04:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=134</guid>
		<description><![CDATA[Muchas veces hay una necesidad de ejecutar un comando Linux (o Windows) desde Java. Las razones pueden ser varias, a veces conviene usar una cosa que ya está disponible en forma de comando (imaginaros el prototipo de un programa con el presupuesto aún sin aprobar) o a lo mejor simplemente porque una utilidad de consola [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces hay una necesidad de <strong>ejecutar un comando Linux (o Windows) desde Java</strong>. Las razones pueden ser varias, a veces conviene usar una cosa que ya está disponible en forma de comando (imaginaros el prototipo de un programa con el presupuesto aún sin aprobar) o a lo mejor simplemente porque una utilidad de consola consume mucho menos recursos que Java (supongamos que tenemos que recodificar avi -> fla muchos videos que nos han subido). El caso es que Java sirve perfectamente para ello, teniendo en cuenta ciertas consideraciones.</p>
<p>Veamos el código:</p>
<p><code><br />
Process proc = Runtime.getRuntime().exec("ls -la");<br />
InputStream is = proc.getInputStream();<br />
int size;<br />
String s;<br />
int exCode = proc.waitFor();<br />
StringBuffer ret = new StringBuffer();<br />
while((size = is.available()) != 0) {<br />
	byte[] b = new byte[size];<br />
	is.read(b);<br />
	s = new String(b);<br />
	ret.append(s);<br />
}<br />
System.out.println(ret.toString());<br />
</code></p>
<p>La primera línea nos crea un <strong>proceso dentro de nuestro Runtime</strong>, con el comando <em>ls -la</em> dentro. Acto seguido obtenemos un <strong>InputStream</strong> para poder ver la salida estándar del programa. Y aquí viene la primera consideración, en el momento de lanzar el proceso con <strong>Runtime.getRuntime().exec()</strong> arranca un subproceso que sigue a su ritmo completamente. Quiero decir, si nada más arrancar el proceso intentamos leer lo que ha devuelto tendremos un <strong>String</strong> vacío, ya que de momento el processo no ha sacado nada por la salida estándar.</p>
<p>La solución para eso es esperar hasta que el proceso termine. Esto lo hacemos con la siguiente línea: <strong>proc.waitFor();</strong> Lo que hace es que detiene el <strong>Thread</strong> dentro del cual hemos lanzado el proceso y espera hasta que termine el proceso (cuidado con los bloqueos). Como resultado devuelve un número entero con el <strong>código de terminación del proceso lanzado</strong>. Normalmente el código 0 significa OK, en caso de que se haya producido algún error lo normal es que devuelva otro valor.</p>
<p>Las siguientes líneas simplemente leen lo que el proceso ha enviado por la salida estándar y sacan el resultado por pantalla.</p>
<p>Otra consideración de la que no debemos olvidarnos es que un proceso tiene los siguientes flujos (dos de ellos para leer y uno para escribir):</p>
<ol>
<li>STDIN &#8211; flujo de entrada estándar. Mediante este flujo podemos enviarle datos al comando. Se obtiene mediante <strong>Process.getOutputStream()</strong>.</li>
<li>STDOUT &#8211; flujo de salida estándar. Es el que hemos usado en nuestro ejemplo.</li>
<li>STDERR &#8211; flujo para la salida de errores. Se obtiene mediante <strong>Process.getErrorStream()</strong>.</li>
</ol>
<p><a href="http://xand.es/ejecutar-comandos-linux-desde-java-ii_20090817">Segunda parte</a> &#8212; como hacer lo mismo pero <strong>sin bloquear el Thread</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/ejecutar-comandos-linux-desde-java_20090816/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conectarse desde Java a MySQL mediante JDBC</title>
		<link>http://xand.es/conectarse-desde-java-a-mysql-mediante-jdbc_20090814</link>
		<comments>http://xand.es/conectarse-desde-java-a-mysql-mediante-jdbc_20090814#comments</comments>
		<pubDate>Fri, 14 Aug 2009 16:50:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=121</guid>
		<description><![CDATA[Este post es una microchuleta sobre como uno puede conectarse a MySQL desde Java mediante JDBC. Existe infinidad de métodos y librerías para realizar esta tarea, pero aquí vamos a ver el más directo.
Supongamos que tenemos una tabla llamada test en la base de datos llamada prueba. Lo primero que tenemos que hacer es cargar [...]]]></description>
			<content:encoded><![CDATA[<p>Este post es una microchuleta sobre como uno puede <strong>conectarse a MySQL desde Java mediante JDBC</strong>. Existe infinidad de métodos y librerías para realizar esta tarea, pero aquí vamos a ver el más directo.</p>
<p>Supongamos que tenemos una tabla llamada <em>test</em> en la base de datos llamada <em>prueba</em>. Lo primero que tenemos que hacer es <strong>cargar el controlador</strong> (también llamado <strong>Driver</strong>).</p>
<p><code>Class.forName("com.mysql.jdbc.Driver");</code></p>
<p>Ahora componemos la <strong>URL de conexión a la BBDD</strong> y conectamos:</p>
<p><code><br />
String urlDDBB = "jdbc:mysql://localhost:3306/prueba?user=root&amp;password=contrasenya";<br />
Connection conn = DriverManager.getConnection(urlDDBB);<br />
</code></p>
<p>Con esto le indicamos al controlador que nuestro servidor de MySQL se encuentra en <em>localhost</em>, escucha en el <strong>puerto <em>3306</em></strong> (estándar), la base de datos se llama <em>prueba</em>, el usuario con el que conectamos es <em>root</em> y su contraseña es <em>contrasenya</em>. Una vez realizado podemos empezar a lanzar consultas a la tabla. Vamos a ver como podemos obtener los distintos valores que pueden guardarse en la tabla a asignarlos a las variables nuestras.</p>
<p><code><br />
String consulta = "SELECT * FROM test";<br />
String s;<br />
int i;<br />
Date d;<br />
long l;<br />
double dd;<br />
Statement stmt = conn.createStatement();<br />
ResultSet rs = stmt.executeQuery(consulta);<br />
while(rs.next()){<br />
s = rs.getString("columna_string");<br />
i = rs.getInt("columna_int");<br />
d = rs.getDate("columna_date");<br />
l = rs.getLong("columna_long");<br />
dd = rs.getDouble("columna_double");<br />
}<br />
</code></p>
<p>Una cosa muy importante que debemos de hacer una vez hemos terminado de trabajar con los datos de la tabla es cerrar todos los componentes:</p>
<p><code><br />
rs.close();<br />
stmt.close();<br />
conn.close();<br />
</code></p>
<p>Espero que sirva de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/conectarse-desde-java-a-mysql-mediante-jdbc_20090814/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiar una palabra por otra en Java</title>
		<link>http://xand.es/cambiar-una-palabra-por-otra-en-java_20090814</link>
		<comments>http://xand.es/cambiar-una-palabra-por-otra-en-java_20090814#comments</comments>
		<pubDate>Fri, 14 Aug 2009 15:35:42 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Soluciones]]></category>

		<guid isPermaLink="false">http://xand.es/?p=110</guid>
		<description><![CDATA[Mucha gente pregunta sobre cómo se puede cambiar una palabra por otra en Java. Es decir, lo que pretende el usuario normalmente es sustituir una cadena de caracteres por otra.
Por suerte, Java es bastante flexible y nos da dos opciones para hacerlo. La primera opción va a resulta más sencilla para toda aquella gente que [...]]]></description>
			<content:encoded><![CDATA[<p>Mucha gente pregunta sobre cómo se puede <strong>cambiar una palabra por otra en Java</strong>. Es decir, lo que pretende el usuario normalmente es <strong>sustituir una cadena de caracteres</strong> por otra.</p>
<p>Por suerte, Java es bastante flexible y nos da dos opciones para hacerlo. La primera opción va a resulta más sencilla para toda aquella gente que no conoce <strong>expresiones regulares (RegExp)</strong> y consiste básicamente en separar la cadena en cadenas más pequeñas usando como separador la palabra buscada. Luego se concatena todo y se mete entre medias la cadena que queramos poner. Este es el algoritmo:</p>
<p><code>static String replace(String str, String pattern, String replace) {<br />
int s = 0;<br />
int e = 0;<br />
StringBuffer result = new StringBuffer();<br />
while ((e = str.indexOf(pattern, s)) >= 0) {<br />
result.append(str.substring(s, e));<br />
result.append(replace);<br />
s = e+pattern.length();<br />
}<br />
result.append(str.substring(s));<br />
return result.toString()<br />
}<br />
</code></p>
<p>Otra forma mucho más sencilla de hacerlo es mediante las <strong>expresiones regulares</strong>:<br />
<code><br />
String s = "Cadena1 larga muy muy larga";<br />
s = s.replaceAll("\\{Cadena1\\}", "Cadena2")</code></p>
<p>En este ejemplo la cadena <em>Cadena1</em> va a ser sustituida por <em>Cadena2</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://xand.es/cambiar-una-palabra-por-otra-en-java_20090814/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
