Recetas Java¶
Ver la versión en la que está compilada una clase de java¶
Para ver la versión en la que está compilada una clase de java, se puede hacer con el comando file desde linux (o desde cmder en windows).
Este comando nos da una versión con un código numérico que corresponde con la versión de JDK según la siguiente tabla:
major | minor | versión JDK |
---|---|---|
45 | 3 | 1.0 |
45 | 3 | 1.1 |
46 | 0 | 1.2 |
47 | 0 | 1.3 |
48 | 0 | 1.4 |
49 | 0 | 5 |
50 | 0 | 6 |
51 | 0 | 7 |
52 | 0 | 8 |
53 | 0 | 9 |
54 | 0 | 10 |
Propiedades del sistema¶
//Imprime todas las propiedades del sistema
package propiedadessistema;
import java.util.*;
public class PropiedadesSistema {
public static void main(String[] args) {
Properties propiedades = System.getProperties();
Enumeration nombrePropiedades = propiedades.propertyNames();
while (nombrePropiedades.hasMoreElements()) {
String nombrePropiedad = (String) nombrePropiedades.nextElement();
String valorPropiedad = propiedades.getProperty(nombrePropiedad);
System.out.println("Llave:" + nombrePropiedad + "=" + valorPropiedad);
}
}
}
Pasar objeto a String¶
toString() vs (String) vs String.valueOf cuando hay nulos
Cuando queremos pasar un objeto a String (por ejemplo de un Map), si hacemos un toStringy el objeto es nulo tendremos una excepción. Es mejor castearlo a String. Ojo que si el objeto no fuera de tipo String (por ejemplo, si es un entero) va a ser ahora cuando salte la excepción
La solución completa es ésta:
String s = String.valueOf(obj);
así si obj es nulo, s será nulo; si es del tipo String no habrá problema y si es de otro tipo lo casteará.
Obtener SID de la base de datos¶
Connection con = JCYLGestionTransacciones.getConnection(InterfaceConexion.NOMBRE_DATASOURCE);
String urlCon = con.getMetaData().getURL();
String sidBD = urlCon.substring(urlCon.lastIndexOf(":")+1,urlCon.length());
Obtener extensión fichero¶
// Obtener la extensión de un fichero en java
//FilenameUtils.getExtension from Apache Commons IO
String ext = FilenameUtils.getExtension("/path/to/file/foo.txt");
Modificar booleanos en Java¶
No se pueden modificar booleanos que se pasan como parámetro, ya que es un objeto primitivo. Un pequeño “truco” de cómo hacerlo
he mirado lo del boolean y como es un objeto primitivo es inmutable.
El truco que he visto por ahí es usar un array de booleans y usar sólo el primer elemento.
Se definiría así:
Boolean [] tieneAsistencias = new Boolean [] {new Boolean(true)};
Para poner el argumento en el método al que llama se añade:
public método (Boolean [] tieneAsistencias) ....
Y ahí ya puedes modificar el valor con tieneAsistencias[0]=false;
que eso sí lo recoge el método original
y la comprobación se haría siempre respecto de tieneAsistencias[0]
Detecta el tipo MIME de un fichero¶
// Detectar el tipo mime de un fichero
import org.apache.tika.detect.DefaultDetector;
import org.apache.tika.detect.Detector;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MimeTypes;
private static final Detector DETECTOR = new DefaultDetector(
MimeTypes.getDefaultMimeTypes());
public static String detectMimeType(final File file) throws IOException {
TikaInputStream tikaIS = null;
try {
tikaIS = TikaInputStream.get(file);
/*
* Aquí habría que pasar el fichero sin la extensión. Ya que primero
* mira la extensión del fichero para devolverlo como respuesta.
* Si no sabe la extensión, busca el tipo mime con los números mágicos,
* si aún así no lo reconoce, mira el contenido del fichero
*/
final Metadata metadata = new Metadata();
// metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName());
return DETECTOR.detect(tikaIS, metadata).toString();
} finally {
if (tikaIS != null) {
tikaIS.close();
}
}
}
// source: http://stackoverflow.com/questions/8488491/how-to-accurately-determine-mime-data-from-a-file
Lanzar excepción¶
int kk = (int) 3/0;
Fechas¶
Distintas formas de comparar fechas en Java¶
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class CompararFechas {
public static void main ( String args [] ) {
System.out.println("Datos iniciales:");
// Fecha / Hora
String stFecha1 = "22/01/2011 14:36";
String stFecha2 = "22/01/2011 14:35";
String stFecha3 = "22/02/2011 14:36";
System.out.println("Fecha/Hora-1:"+stFecha1);
System.out.println("Fecha/Hora-2:"+stFecha2);
System.out.println("Fecha/Hora-3:"+stFecha3);
System.out.println();
System.out.println();
// Utilizando Date y SimpleDateFormat
System.out.println();
System.out.println("Utilizando Date:");
System.out.println();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
// El método parse devuelve null si no se ha podido parsear el string en según el formato indicado. Este método lanza una excepción NullPointer exception si alguno de sus parámetros es null
Date fecha1 = sdf.parse(stFecha1 , new ParsePosition(0));
// El método parse devuelve null si no se ha podido parsear el string en según el formato indicado. Este método lanza una excepción NullPointer exception si alguno de sus parámetros es null
Date fecha2 = sdf.parse(stFecha2 , new ParsePosition(0));
// El método parse devuelve null si no se ha podido parsear el string en según el formato indicado. Este método lanza una excepción NullPointer exception si alguno de sus parámetros es null
Date fecha3 = sdf.parse(stFecha3 , new ParsePosition(0));
// Comparaciones
if ( fecha1.before(fecha2) ) System.out.println(" Fecha1 es anterior a fecha2.");
else System.out.println(" Fecha1 NO es anterior a fecha2.");
if ( fecha1.before(fecha3) ) System.out.println(" Fecha1 es anterior a fecha3.");
else System.out.println(" Fecha1 NO es anterior a fecha3.");
if ( fecha2.before(fecha3) ) System.out.println(" Fecha2 es anterior a fecha3.");
else System.out.println(" Fecha2 NO es anterior a fecha3.");
// Utilizando Calendar.
System.out.println();
System.out.println("Utilizando GregorianCalendar:");
System.out.println();
// Con las mismas fechas, creamos los Calendar's
Calendar cal1 = new GregorianCalendar();
cal1.setTime(fecha1);
Calendar cal2 = new GregorianCalendar();
cal2.setTime(fecha2);
Calendar cal3 = new GregorianCalendar();
cal3.setTime(fecha3);
// Comparaciones
if ( cal1.before(cal2) ) System.out.println(" Cal1 es anterior a cal2.");
else System.out.println(" Cal1 NO es anterior a cal2.");
if ( cal1.before(cal3) ) System.out.println(" Cal1 es anterior a Cal3.");
else System.out.println(" Cal1 NO es anterior a cal3.");
if ( cal2.before(cal3) ) System.out.println(" Cal2 es anterior a Cal3.");
else System.out.println(" Cal2 NO es anterior a cal3.");
// Tanto para Date como para Calendar/GregorianCalendar
// podemos hacer una comparación "numérica", obteniendo
// la representación de la fecha/hora en milisegundos.
// Por convenio, esta cuenta se inicia en el 01/01/1970 a las 0:00:00 GMT
System.out.println();
System.out.println("En milisegundos:");
System.out.println();
System.out.println(" Milisegundos de fecha1:"+fecha1.getTime());
System.out.println(" Milisegundos de fecha2:"+fecha2.getTime());
System.out.println(" Milisegundos de fecha3:"+fecha3.getTime());
System.out.println(" Milisegundos de cal1: "+cal1.getTimeInMillis());
System.out.println(" Milisegundos de cal2: "+cal2.getTimeInMillis());
System.out.println(" Milisegundos de cal3: "+cal3.getTimeInMillis());
}
}
Calcula la diferencia entre dos fechas dadas¶
//En este ejemplo lo que se quiere es saber si el alumno tiene menos de 35 años o más de 45 (son colectivos especiales) a fecha de inicio del curso
import org.joda.time.*;
String sFechaInicioGrupo = (String)map.get(InterfaceFCSeguimiento.CAMPO_GRU_INI_FEC);
String sFechaNacimiento = (String)m.get("CAM_PER_FEC_NAC");
try {
if (sFechaInicioGrupo!= null & !sFechaInicioGrupo.equals("")
&& sFechaNacimiento!= null & !sFechaNacimiento.equals("")) {
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
Date fechaInicioGrupo = formatoFecha.parse(sFechaInicioGrupo);
Date fechaNacimiento = formatoFecha.parse(sFechaNacimiento);
DateTime dtFechaNacimiento = new DateTime(fechaNacimiento);
DateTime dtFechaInicioGrupo = new DateTime(fechaInicioGrupo);
int diferenciaAnnos = Years.yearsBetween(dtFechaNacimiento, dtFechaInicioGrupo).getYears();
if (diferenciaAnnos < 35)
m.put(InterfaceFCSeguimiento.CAMPO_ALU_COL_MEN_35, "S");
else
m.put(InterfaceFCSeguimiento.CAMPO_ALU_COL_MEN_35, "N");
if(diferenciaAnnos > 45)
m.put(InterfaceFCSeguimiento.CAMPO_ALU_COL_MAY_45, "S");
else
m.put(InterfaceFCSeguimiento.CAMPO_ALU_COL_MAY_45, "N");
}
} catch(Exception e) {
SGF2ConfigApp.loggerFc.error("Error al operar con las fechas para obtener " +
"colectivos <35 y >45 años", e);
}
Jasper Reports¶
Líneas en blanco en los listados Excel con jasper¶
Se añade el parámetro IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS
en la generación del report (HIPEInformeLN.java)
//Generar el documento en Excel
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, byteArrayOutputStream);
exporterXLS.setParameter( JRXlsAbstractExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); //[3165] Evita filas en blanco
exporterXLS.exportReport();
Además, en el report se ponen los campos con la propiedad Stretch Type igual a “Relative to Band Height”:
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement stretchType="RelativeToBandHeight" x="0" y="0" width="45" height="20" isPrintWhenDetailOverflows="true"/>
<box>
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement textAlignment="Right">
<font size="7"/>
</textElement>
<textFieldExpression class="java.lang.String"> <![CDATA[$F{tablaDatos}.getCIndice()]]> </textFieldExpression>
</textField>
Exporta a RTF con JasperReports utilizando conexión a base de datos¶
/*
Exporta a RTF con JasperReports utilizando conexión a base de datos
*/
private byte[] runReportToRtf(String report, Map parametros, Connection conexion) throws Exception
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Cargamos y rellenamos el report
JasperPrint jp = JasperFillManager.fillReport(report, parametros, conexion);
// Exportamos al formato requerido
JRRtfExporter exporter = new JRRtfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();
return baos.toByteArray();
}