viernes, 26 de julio de 2024

Operaciones basicas de Entrada y Salida en Java

Esta lección cubre las clases de la plataforma Java usadas para operaciones básicas de entrada y salida I/O. Primero nos enfocamos en flujos de entrada y salida I/O un concepto poderoso que simplifica las operaciones I/O. Esta lección también le da una mirada a la serialización, que permite a un programa escribir objetos enteros en un stream de salida y volver leerlos (de sream a objeto).

Continuamos revisando operaciones de lectura y escritura con archivos y operaciones del sistema de archivos, incluyendo el acceso random a los archivos.

La mayoría de las clases cubiertas en la sección de  Flujos de I/O se encuentran en el paquete java.io. La mayoría de las clases cubiertas en la sección Archivos I/O están en el paquete java.nio.file.


Flujos de I/O

Byte Streams manejo de datos binarios

Character Streams manejo de datos caracteres, automáticamente se realiza la traducción hacia y desde el conjunto de carácter local.

Buffered Streams

Scanning and Formatting

I/O from de command line

Data Streams

Object Streams

Archivos I/O

Que es un Path

La clase Path

Operaciones Path

Operaciones File

Verificando un Archivo o Directorio

Borrando un archivo o directorio

Copiando un Archivo o Directorio

Moviendo un Archivo o Directorio

Gestionando Metadata

Leyendo, Escribiendo y Creando Archivos

Random Acces Files

Creando y Leyendo Directorios

Enlaces símbolos

Recorriendo el árbol de archivos

Buscando Archivos

Observando un directorio para cambios

Otros metodos practicos

Codigo legado para Archivos I/O


Referencias:

 https://docs.oracle.com/javase/tutorial/essential/io/index.html


miércoles, 10 de julio de 2024

Trabajando con la clase Print Services y Attributes

En las lecciones anteriores hemos aprendido que el api Java 2D soporta impresión de paginas, proporciona diálogos para ver y seleccionar las impresoras disponibles, configurar paginas, numero de copias y otros atributos específicos de impresión. La clase Printing Services es otro componente clave de cualquier sistema de impresión.

La API Java Print Service (JPS) API extiende de Java 2D para ofrecer las siguientes funcionalidades:

  • La aplicación descubre impresoras que satisfacen sus necesidades consultando dinámicamente las capacidades de la impresora.
  • La aplicación puede extender la clase Attributes incluida en el API JPS
  • Aplicaciones de terceros pueden conectar sus propios servicios de impresión con la interfaz Service Provider Interface SPI, estos servicios propios pueden imprimir diferentes formatos incluidos Postscripts, PDF, y SVG.

La API Java Print Service consiste de 4 paquetes:

  • javax.print
  • javax.print.attribute
  • javax.print.event
  • javax.print.attribute
  • javax.print.attribute.standard
El paquete javax.print proporciona las principales clases e interfaces para la API Java Print Service API. Esto le permite a las aplicaciones cliente y servidor:
  • Descubrir y seleccionar servicios de impresión según sus capacidades.
  • Especificar el formato de los datos de impresión
  • Enviar trabajos de impresión al servicio que admita el tipo de documento que se va a imprimir.
Especificación del Tipo de Documento

La clase DocFlavor representa el formato del dato a imprimir, tales como JPEG o PostScript. La clase DocFlavor consiste de dos partes: un tipo MIME y un nombre de clase de representación.
Un tipo MIME describe el formato, y una clase de representación indica como el documento es entregado a la impresora o al flujo de salida. Una aplicación usa la clase DocFlavor y un conjunto de atributos para encontrar impresoras con capacidades especificadas por el conjunto de atributos.
Este código de ejemplo demuestra como obtener un arreglo de objetos StreamPrintServiceFactory que pueden retornar objetos StreamPrintService con capacidad de convertir una imagen GIF en un PostScript

Definición de Atributos
Los paquetes javax.print.attribute y javax.print.attribute.standard defined atributos de impresión que describen las capacidades de un servicio de impresión, especifican los requerimientos de un trabajo de impresión, y permiten seguir el progreso del trabajo de impresión.
Por ejemplo, si a ti te gustaría usar el formato de papel A4 e imprimir 3 copias de tu documento tendrías que crear un conjunto de los siguientes atributos implementando la interfaz PrintRequestAttributeSet


Entonces tu tienes que pasar el conjunto de atributos al trabajo de impresión mediante el método print junto con el DocFlavor

Buscando Servicios de Impresión
Una aplicación invoca el método estático de la clase abstracta PrintServiceLookup para localizar servicios de impresión que tengan la capacidad de satisfacer la petición de impresión. Por ejemplo, en orden de imprimir dos copias por ambos lados de un documento, la aplicación primero necesita encontrar impresoras que tengan la capacidad de imprimir ambos lados.

Usos comunes del API
En conclusión, el API Java Print Service ejecuta los siguientes pasos para procesar una petición de impresión.

  1. Elije un DocFlavor
  2. Crea un conjunto de atributos
  3. Localiza un servicio de impresión que pueda manejar la petición de impresión como fue especificada por el DocFlavor y el conjunto de atributo.
  4. Crea un objeto de la clase Doc encapsulando el DocFlavor y la data actual a imprimir.
  5. Obtener un objeto de la clase Print Job, representado por DocPrintJob, desde el servicio de impresión
  6. Llama al método print del objeto Print Job


martes, 2 de abril de 2024

Guia rapida de ANT para proyectos en Netbeans

 En esta entrada te dejaré las claves para que te manejes en el uso de ANT.

Apache Ant es una biblioteca Java y una herramienta de línea de comandos cuya misión es ejecutar los procesos descritos en archivos xml como target y task que dependen unos de otros. El principal uso conocido de Ant es la creación de aplicaciones Java. Ant proporciona una serie de tareas integradas que permiten compilar, ensamblar, probar y ejecutar aplicaciones Java. Ant también se puede utilizar de forma eficaz para crear aplicaciones que no sean Java, por ejemplo aplicaciones C o C++. De manera más general, Ant se puede utilizar para automatizar cualquier tipo de proceso que pueda describirse en términos de targets y tasks.

Ant está escrito en Java. Los usuarios de Ant pueden desarrollar sus propios "antlibs" que contienen tareas y tipos de Ant, y se les ofrece una gran cantidad de "antlibs" comerciales o de código abierto ya preparados.

Ant es extremadamente flexible y no impone convenciones de codificación ni diseños de directorios a los proyectos Java que lo adoptan como herramienta de compilación.
El proyecto Apache Ant es parte de Apache Software Foundation.


El archivo de tareas build.xml y build-impl.xml

Es un archivo xml donde se describen todas las tareas que quieres que ANT ejecute, tareas como compilar, crear archivos y directorios, copiar archivos, incluso ejecutar otros jars.

Este archivo XML debe cumplir con el DTD de ANT, aquí puedes encontrar la lista de cada una de las tareas predefinidas

https://ant.apache.org/manual/Tasks/

Si has creado tu proyecto con Netbeans en el directorio de tu proyecto vas a tener el archivo build.xml, si editas este archivo te vas a dar cuenta que el archivo está casi vacío pero hay una linea clave

<import file="nbproject/build-impl.xml"/>

Si entras al directorio nbproject vas a encontrar el archivo build-impl.xml, es un archivo de procesos para ANT, gracias a este archivo tu puedes hacer un clean and build y generar tu jar. No vamos a entrar en detalles, este archivo es muy complejo y extenso.

Para no tener que editar el archivo build-impl.xml Netbeans pone a tu disposición una lista de targets los cuales están vacíos y puedes usarlos para ejecutar tus tareas. A continuación te presento la lista disponible.


      -pre-init:                 called before initialization of project properties
      -post-init:                called after initialization of project properties
      -pre-compile:              called before javac compilation
      -post-compile:             called after javac compilation
      -pre-compile-single:       called before javac compilation of single file
      -post-compile-single:      called after javac compilation of single file
      -pre-compile-test:         called before javac compilation of JUnit tests
      -post-compile-test:        called after javac compilation of JUnit tests
      -pre-compile-test-single:  called before javac compilation of single JUnit test
      -post-compile-test-single: called after javac compilation of single JUunit test
      -pre-jar:                  called before JAR building
      -post-jar:                 called after JAR building
      -post-clean:               called after cleaning build products

Estos targets se ejecutan antes y después de los targets principales. Por ejemplo, existe un target llamado init, Netbeans te proporciona -pre-init y -pos-init y así para el resto de Targets.

Properties en ANT

Las propiedades son pares clave-valor donde Apache Ant intenta evaluar ${key} al valor en tiempo de ejecución.

Hay muchas tareas (task) que pueden establecer propiedades; la más común es la tarea property. Además, las propiedades se pueden definir mediante argumentos de línea de comando o mecanismos similares desde fuera de Ant.

Normalmente, los valores de las propiedades no se pueden cambiar: una vez que se establece una propiedad, la mayoría de las tareas no permitirán que se modifique su valor. En general, las propiedades son de alcance global, es decir, una vez que se han definido, están disponibles para cualquier tarea (task)  u objetivo (target) invocado posteriormente; no es posible establecer una propiedad en un proceso de construcción hijo creado mediante las tareas ant, antcall o subant y make. Sin embargo, está disponible para el proceso de compilación de llamadas.

Desde Ant 1.8.0, la tarea local se puede utilizar para crear propiedades con alcance local para un objetivo o un elemento secuencial como el de la tarea macrodef.

A continuación un ejemplo del uso de la tarea property

Definimos una propiedad con el nombre yguard.version y le asignamos el valor 4.1.0, definimos una propiedad lib.dir y le asignamos el resultado de la concatenación del valor de la propiedad ${basedir}/lib

Usamos la tarea echo para imprimir el valor de la propiedad basedir