Saltar a contenido

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();
  }

Última actualización: August 15, 2021