Upload
rafaelrojas91
View
292
Download
1
Embed Size (px)
Citation preview
Instituto Universitario Politécnico Santiago Mariño
Extensión Porlamar Sede Genovés
Ingeniería de sistemas (47)
Materia: Programación No Numérica II
ARCHIVOS EN JAVA
Realizado por:
Br. Rafael Rojas
C.I. 20.326.928
Porlamar Julio 2014
Introducción
Mediante el lenguaje de programación Java se pueden desarrollar diversas
aplicaciones por ser un lenguaje orientado a objetos permite el uso de herencia,
acoplamiento, encapsulamiento, lo que hace posible el desarrollo de diversas
aplicaciones.
Se debe considerar que al desarrollar una aplicación es imprescindible
manejar o por lo mínimo conocer las tareas básicas programables, como son el
uso de archivos, arrays, y por consiguiente la lectura y escritura de los tipos de
datos.
Como todo lenguaje de programación, Java hace uso de librerías y hay que
aplicar ciertas clases necesarias para la ejecución de los programas. Es un
lenguaje de programación de propósito general, concurrente,orientado a
objetos y basado en clases que fue diseñado específicamente para tener tan
pocas dependencias de implementación como fuera posible. Su intención es
permitir que losdesarrolladores de aplicaciones escriban el programa una vez y lo
ejecuten en cualquier dispositivo (conocido en inglés como WORA, o "write once,
run anywhere"), lo que quiere decir que el código que es ejecutado en una
plataforma no tiene que ser recompilado para correr en otra. Java es, a partir de
2012, uno de los lenguajes de programación más populares en uso,
particularmente para aplicaciones de cliente-servidor de web, con unos 10
millones de usuarios reportados. Este lenguaje se denominó inicialmente Oak (por
un roble que había fuera de la oficina de Gosling), luego pasó a
denominarse Green tras descubrir que Oakera ya una marca comercial registrada
para adaptadores de tarjetas gráficas y finalmente se renombró a Java.
.
Entrada y salida de datos en java
Es un intercambio de datos entre el programa y el exterior. La entrada y
salida en java se implementa en el paquete java.io.
La E/S en java se basa en el concepto de flujo, que es una secuencia
ordenada de datos que tienen una fuente (flujos de entrada) o un destino (flujos de
salida). Las clases de E/S aíslan a los programadores de los detalles específicos
del sistema de funcionamiento de la máquina, al tiempo que posibilitan el acceso a
recursos del sistema por medio de ficheros o archivos (files).
Entrada básica: la clase InputStream
La clase abstracta InputStream declara los métodos para leer datos desde
una fuente concreta y es la clase base de la mayor parte de los flujos de entrada
en java.io. Soporta los métodos siguientes:
intread() lee un sólo byte de datos y los devuelve en el rango [0..255].
Devuelve -1 cuando se alcanza el final del flujo y no puede seguir leyendo
bytes.
intread(byte [] buf) lee un array de bytes hasta buf.length. Devuelve el
número de bytes leidos o -1 cuando se llega al final del flujo.
intread(byte [] buf, int off, intlen) lee len bytes del flujo (o los que pueda)
y los coloca a partir de la posición off del array.
longskip(longcount) salta hasta count bytes de entrada o hasta el final del
flujo de entrada, devolviendo el número de bytes saltados.
intavailable() devuelve el número de bytes que están disponibles para
leerse.
voidclose() cierra el flujo de entrada que abrió el constructor no-arg,
liberando los recursos asociados a ese flujo. No es necesario invocar este
método ya que el flujo se cierra cuando se destruye el objeto aunque es
conveniente hacerlo ya que vuelca el buffer sobre el disco.
Salida básica: la clase OutputStream
La clase abstracta OutputStream es análoga a InputStream sólo que
proporciona métodos para manejar el flujo de salida. Los métodos que incluye son:
voidwrite(int b) escribe b como byte, que, aunque sea declarado
como int es transformado a byte. Esto es porque habitualmente es el
resultado de una operación previa.
voidwrite(byte [] buf) escribe un array de bytes.
voidwrite(byte [] buf, int offset, intcount) escribe un array buf de bytes,
empezando en la posición offset y escribiendo count de ellos, deteniéndose
antes si encuentra el final del array.
voidflush() vacía el flujo de modo que los bytes que quedaran por escribir
son escritos.
voidclose() cierra el flujo de salida liberando los recursos asociados a ese
flujo.
A menos que se diga lo contrario estos métodos lanzan una
excepción IOException si detectan algún error en el flujo de salida.
Salida con formato: la clase PrintStream
La clase PrintStream proporciona utilidades para dar formato a la salida.
Tiene dos métodos print y println que están sobrecargados para los tipos
primitivos, objetos, cadenas y arrays de caracteres. La diferencia entre ambos
métodos está en que println añade un carácter de nueva línea. Además el
método println puede llamarse sin argumentos, produciendo una nueva línea.
System.out es una referencia a PrintStream. PrintStream proporciona dos
constructores, ambos con un primer argumento de tipo OutputStream cuya
diferencia está en un segundo argumento booleano que indica si debe vaciar el
flujo con cada carácter de nueva línea.
Clases de java para lectura y escritura de datos
Las jerarquías de clases
En el lenguaje Java los flujos de datos se describen mediante clases que
forman jerarquías según sea el tipo de dato char Unicode de 16 bits o byte de 8
bits. A su vez, las clases se agrupan en jerarquías según sea su función de lectura
o de escritura.
La característica de internacionalización del lenguaje Java es la razón por la
que existe una jerarquía separada de clases para la lectura y escritura de
caracteres.
Todas estas clases se encuentran en el paquete java.io, por lo que al
principio del código fuente se deberá escribir la sentencia
import java.io.*;
Char Unicode, 16 bits
Byte, 8 bits.
Lectura
Las clases Reader e InputStream son similares aunque se refieren a
distintos tipos de datos, lo mismo ocurre con Writer y OutputSream.
Por ejemplo, Reader proporciona tres métodos para leer un carácter char o
un array de caracteres
InputStream proporciona métodos similares para leer un byte o un array de bytes.
int read()
int read(charbuf[])
int read()
int read(bytebuf[])
La primera versión lee un byte como entero del flujo de entrada, devuelve –
1 si no hay más datos que leer. La segunda versión, lee un array de bytes
devolviendo el número de bytes leídos. La tercera versión, lee también, un array
de bytes, pero nos permite especificar, la posición de comienzo del array en la que
se empiezan a guardar los bytes, y el máximo número de bytes que se van a leer.
Escritura
La clase Writer proporciona tres métodos para escribir un carácter char o un array de caracteres
La clase OutputStream proporciona métodos similares
Entrada/Salida estándar (Teclado y Pantalla)
Aquí sólo se tratara la entrada/salida que se comunica con el usuario a
través de la pantalla o de la ventana del terminal.
Si se crea una applet no se utilizarán normalmente estas funciones, ya que
su resultado se mostrará en la ventana del terminal y no en la ventana de
int write(int c)
int write(charbuf[])
int write(charbuf[], int offset, intlen)
int write(int c)
int write(bytebuf[])
int write(bytebuf[], int offset, intlen)
la applet. La ventana de la applet es una ventana gráfica y para poder realizar una
entrada o salida a través de ella será necesario utilizar el AWT.
El acceso a la entrada y salida estándar es controlado por tres objetos que
se crean automáticamente al iniciar la
Aplicación: System.in, System.out y System.err
System.in
Este objeto implementa la entrada estándar (normalmente el teclado). Los
métodos que proporciona para controlar la entrada son:
read(): Devuelve el carácter que se ha introducido por el teclado leyéndolo
del buffer de entrada y lo elimina del buffer para que en la siguiente lectura
sea leído el siguiente carácter. Si no se ha introducido ningún carácter por
el teclado devuelve el valor -1.
skip(n): Ignora los n caracteres siguientes de la entrada.
System.out
Este objeto implementa la salida estándar. Los métodos que proporciona para
controlar la salida son:
print(a): Imprime a en la salida, donde a puede ser cualquier tipo básico
Java, ya que Java hace su conversión automática a cadena.
println(a): Es idéntico a print(a) salvo que con println () se imprime un salto
de línea al final de la impresión de a.
System.err
Este objeto implementa la salida en caso de error. Normalmente esta salida
es la pantalla o la ventana del terminal como con System.out, pero puede ser
interesante redirigirlo, por ejemplo hacia un fichero, para diferenciar claramente
ambos tipos de salidas.
Las funciones que ofrece este objeto son idénticas a las proporcionadas
por System.out.
Entrada/Salida por fichero
Tipos de ficheros
En Java es posible utilizar dos tipos de ficheros (de texto o binarios) y dos
tipos de acceso a los ficheros (secuencial o aleatorio).
Los ficheros de texto están compuestos de caracteres legibles, mientras
que los binarios pueden almacenar cualquier tipo de datos (int, float, boolean,...).
Una lectura secuencial implica tener que acceder a un elemento antes de
acceder al siguiente, es decir, de una manera lineal (sin saltos). Sin embargo los
ficheros de acceso aleatorio permiten acceder a sus datos de una forma aleatoria,
esto es indicando una determinada posición desde la que leer/escribir.
Clases a estudiar
En el paquete java.io existen varias clases de las cuales se pueden crear
instancias de clases para tratar todo tipo de ficheros.
Las tres principales son:
FileOutputStream: Fichero de salida de texto. Representa ficheros de texto
para escritura a los que se accede de forma secuencial.
FileInputStream: Fichero de entrada de texto. Representa ficheros de texto
de sólo lectura a los que se accede de forma secuencial.
RandomAccessFile: Fichero de entrada o salida binario con acceso
aleatorio. Es la base para crear los objetos de tipo fichero de acceso
aleatorio. Estos ficheros permiten multitud de operaciones; saltar hacia
adelante y hacia atrás para leer la información que sea necesaria en cada
momento, e incluso leer o escribir partes del fichero sin necesidad de
cerrarlo y volverlo a abrir en un modo distinto.
La clase FileInputStream
Mediante los objetos de esta clase se lee de ficheros de texto de forma
secuencial.
Presenta el método read() para la lectura del fichero. Este método se puede
invocar de varias formas.
intread(): Devuelve el siguiente carácter del fichero.
intread( byte a[] ): Llena el vector a con los caracteres leídos del fichero.
Devuelve la longitud del vector que se ha llenado si se realizó con éxito o –
1 si no había suficientes caracteres en el fichero para llenar el vector.
intread( byte a[], int off, intlen ): Lee len caracteres del fichero, insertándolos
en el vector a.
Todos ellos devuelven -1 si se ha llegado al final del fichero (momento de
cerrarle).
El siguiente ejemplo muestra el fichero de texto "/carta.txt" en pantalla:
import java.io.*;
classMuestraCarta {
public static void main(String args[]) throws IOException {
int c;
FileInputStream f=new FileInputStream("/carta.txt");
while( ( c=f.read() ) != -1 )
System.out.print( (char)c );
f.close();
}
}
La clase RandomAccessFile
Mediante los objetos de esta clase se utilizan ficheros binarios mediante un
acceso aleatorio, tanto para lectura como para escritura. En estos ficheros hay un
índice que dice en qué posición del fichero se encuentran, y con el que se puede
trabajar para posicionarse en el fichero.
Métodos de escritura
La escritura del fichero se realiza con una función que depende el tipo de
datos que se desee escribir.
voidwrite( byte b[], intini, intlen ); Escribe len caracteres del vector b.
voidwrite(int i ); Escribe la parte baja de i (un byte) en el flujo.
voidwriteBoolean(boolean b ); Escribe el boolean b como un byte.
voidwriteByte(int i ); Escribe i como un byte.
voidwriteBytes(String s ); Escribe la cadena s tratada como bytes, no
caracteres.
voidwriteChar(inti ); Escribe i como 1 byte.
voidwriteChars( String s ); Escribe la cadena s.
voidwriteDouble(double d ); Convierte d a long y le escribe como 8 bytes.
voidwriteFloat(float f ); Convierte f a entero y le escribe como 4 bytes.
voidwriteInt(inti ); Escribe i como 4 bytes.
voidwriteLong( long v ); Escribe v como 8 bytes.
voidwriteShort(inti ); Escribe i como 2 bytes.
voidwriteUTF(String s ); Escribe la cadena s utilizando la codificación UTF-
8.
Los métodos que escriben números de más de un byte escriben el primero
su parte alta.
Métodos de lectura
La lectura del fichero se realiza con una función que depende del tipo de
datos que queremos leer.
booleanreadBoolean(); Lee un byte y devuelve false si vale 0 o true sino.
byte readByte(); Lee y devuelve un byte.
charreadChar(); Lee y devuelve un caracter.
doublereadDouble(); Lee 8 bytes, y devuelve un double.
floatreadFloat(); Lee 4 bytes, y devuelve un float.
voidreadFully( byte b[] ); Lee bytes del fichero y los almacena en un
vector b.
voidreadFully( byte b[], intini, intlen ); Lee len bytes del fichero y los
almacena en un vector b.
intreadInt(); Lee 4 bytes, y devuelve un int.
longreadLong(); Lee 8 bytes, y devuelve un long.
shortreadShort(); Lee 2 bytes, y devuelve un short.
intreadUnsignedByte(); Lee 1 byte, y devuelve un valor de 0 a 255.
intreadUnsignedShort(); Lee 2 bytes, y devuelve un valor de 0 a 65535.
StringreadUTF(); Lee una cadena codificada con el formato UTF-8.
intskipBytes(int n); Salta n bytes del fichero.
Si no es posible la lectura devuelven –1.
Serialización
Para que un programa java pueda convertir un objeto en un montón de bytes y pueda luego recuperarlo, el objeto necesita ser Serializable. Al poder convertir el objeto a bytes, ese objeto se puede enviar a través de red, guardarlo en un fichero, y después reconstruirlo al otra lado de la red, leerlo del fichero.
Para que un objeto sea serializable basta con que implemente la interfaz Serializable. Como la interfaz Serializable no tiene métodos, es muy sencillo implementarla, basta con unimplementsSerializable y nada más. Por ejemplo, la clase Datos siguiente es Serializable y java sabe perfectamente enviarla o recibirla por red, a través de socket o de rmi. También java sabe escribirla en un fichero o reconstruirla a partir del fichero.
Si dentro de la clase hay atributos que son otras clases, éstos a su vez también deben ser Serializable. Por ejemplo
//Esta clase es Serializable porque implementa Serializable y todos sus campos son Serializable, incluido "Datos f;"
public class Datos implements Serializable
{
publicint a;
public String b;
public char c;
}
Lectura de un archivo en un servidor de internet
La clase básica para esto es URL. Con ella se indica la dirección web del fichero y se establace la conexión.
Si no se sabe el tipo de fichero que tiene el enlace, se puede preguntar a la clase URLConnection. Desde luego, el tipo de fichero es totalmente anecdótico, puesto que el método aquí expuesto vale para cualquier tipo de fichero, incluidos los html.
public class DatoGordo implements Serializable
{
publicint d;
publicInteger e;
Datos f;
}
import java.net.URL;
importjava.net.URLConnection;
...
try {
URL url = new URL("http://mas.lne.es/fotos/img/2007/10/62/203093470447035b9bc5a095.43783284-foto_verano.jpg"); URLConnectionurlCon = url.openConnection(); ...} catch (Exception e) {
...
// Esto saca por pantalla "image/jpeg"
System.out.println(urlCon.getContentType());
Para acceder al contenido y descargarlo en un fichero local, pedimos a URLConnection el getInputStream() y lo vamos leyendo y escribiendo en un fichero local hasta el final
Java Foundation Classes (JFC) y Java 2D
Las Java FoundationClasses (JFC, en castellano Clases Base Java) son un
framework gráfico para construir interfaces gráficas de usuario portables basadas
en Java. JFC se compone de Abstract Window Toolkit (AWT), Swing y Java
2D.Juntas, suministran una interfaz de usuario consistente para programas Java,
tanto si el sistema de interfaz de usuario subyacente es Windows, Mac OS
X o Linux.
AWT es la más antigua de las dos APIs de interfaz, y fue criticada
duramente por ser poco más que una envoltura alrededor de las capacidades
gráficas nativas de la plataforma anfitrión. Esto significa que los widgets estándar
en la AWT confían en esas capacidades de los widgets nativos, requiriendo que el
desarrollador también este prevenido de las diferencias entre plataformas anfitrión.
Una API de gráficos alternativa llamada Internet FoundationClasses fue
desarrollada en código más independiente de la plataforma por Netscape.
Últimamente, Sun mezcló la IFC con otras tecnologías bajo el nombre "Swing",
añadiendo la capacidad para un look and feel enchufable de los widgets. Esto
permite a los programas Swing mantener la base del código independiente de la
plataforma, pero imita el look de la aplicación nativa.
En computación, Java 2D es un API para dibujar gráficos en dos
dimensiones usando el lenguaje de programación Java. Cada operación de dibujo
Java 2D puede tratarse como rellenar una forma usando
un pincel y componiendo el resultado en la pantalla.
Una forma en Java 2D es un límite infinitamente delgado el cual define un
interior y un exterior. Los Píxeles internos de la forma están afectados por la
operación de dibujo, los que están fuera no.
Java Media Framework (JMF)
JMF es una API que sirve para incluir multimedia en las aplicaciones de
Java, funciona básicamente, recibiendo el contenido multimedia de alguna fuente,
para después procesarlo y entregarlo en alguna salida multimedia.
La manera más sencilla de poner un reproductor en una applet es utilizando
el MediaPlayerBean.
Se instancia un Media Player, asi:
Para decirle al player que archivo se quiere reproducir se utilizala siguiente línea:
Para iniciar, detener o pausar la reproducción, se usan las siguientes líneas respectivamente:
Java 3D
La API (ApplicationProgram Interface) Java3D es una interfaz de
programación utilizada para realizar aplicaciones y applets con gráficos en tres
dimensiones. Proporciona a los desarrolladores un alto nivel para crear y
MediaPlayer player = new javax.media.bean.playerbean.MediaPlayer():
player.setMediaLocation(dirección del archivo);
player.start();
player.close();
player.stop();
manipular objetos geométrios 3D y para construir las estructuras utilizadas en el
renderizado de dichos objetos. Se pueden describir grandes mundos virtuales
utilizando estos constructores, que proporcionan a Java3D la suficiente
información para hacer un renderizado de forma eficiente.
Algunos objetivos importantes de Java3D son:
Proporcionar un amplio conjunto de utilidades que permitan crear mundos
en 3D interesantes.
Proporcionar un paradigma de programación orientado a objeto de alto nivel
para permitir a los desarrolladores generar sofisticadas aplicaciones y
applets de forma rápida.
Proporcionar soporte a cargadores en tiempo de ejecución. Esto permite
que Java3D se adapte a un gran número de formatos de ficheros, como
pueden ser formatos específicos de distintos fabricantes de CAD, formatos
de intercambio o VRML 1.0 (Virtual RealityModellingLanguage) y VRML 2.0.
Las aplicaciones en Java3D construyen los distintos elementos gráficos
como objetos separados y los conectan unos con otros mediante una estructura
en forma de árbol denominada grafo de escena. La aplicación manipula los
diferentes objetos utilizando los métodos de acceso, de modificación y de unión
definidos en su interfaz.
Java Beans
Los JavaBeans son un modelo de componentes creado por Sun
Microsystems para la construcción de aplicaciones en Java.Se usan para
encapsular varios objetos en un único objeto (la vaina o Bean en inglés), para
hacer uso de un solo objeto en lugar de varios más simples.
La especificación de JavaBeans de Sun Microsystems los define como
"componentes de software reutilizables que se puedan manipular visualmente en
una herramienta de construcción".
A pesar de haber muchas semejanzas, los JavaBeans no deben
confundirse con los Enterprise JavaBeans (EJB), una tecnología de componentes
del lado servidor que es parte de Java EE.
Dentro de un JavaBean podemos distinguir tres partes:
Propiedades: Los atributos que contiene.
Métodos: Se establecen los métodos get y set para acceder y modificar los
atributos.
Eventos: Permiten comunicar con otros JavaBeans.
Ejemplo:
publicclassPersonaBean
implementsjava.io.Serializable {
private String nombre;
privateintedad;
publicPersonaBean() {
// Constructor sin argumentos
}
publicvoidsetNombre(String n) {
this.nombre = n;
}
publicvoidsetEdad(int e) {
this.edad = e;
}
RMI Y JAVA IDL
RMI (Java RemoteMethodInvocation) es un mecanismo ofrecido
por Java para invocar un método de manera remota. Forma parte del entorno
estándar de ejecución de Java y proporciona un mecanismo simple para la
comunicación de servidores en aplicaciones distribuidas basadas exclusivamente
en Java. Si se requiere comunicación entre otras tecnologías debe
utilizarse CORBA o SOAP en lugar de RMI.
RMI se caracteriza por la facilidad de su uso en la programación por estar
específicamente diseñado para Java; proporciona paso de objetos por referencia
(no permitido por SOAP), recolección de basura distribuida (GarbageCollector
distribuido) y paso de tipos arbitrarios (funcionalidad no provista por CORBA).
A través de RMI, un programa Java puede exportar un objeto, con lo que
dicho objeto estará accesible a través de la red y el programa permanece a la
espera de peticiones en un puerto TCP. A partir de ese momento, un cliente puede
conectarse e invocar los métodos proporcionados por el objeto.
La invocación se compone de los siguientes pasos:
Encapsulado (marshalling) de los parámetros (utilizando la funcionalidad
de serialización de Java).
Invocación del método (del cliente sobre el servidor). El invocador se queda
esperando una respuesta.
Al terminar la ejecución, el servidor serializa el valor de retorno (si lo hay) y
lo envía al cliente.
El código cliente recibe la respuesta y continúa como si la invocación
hubiera sido local.
La arquitectura RMI puede verse como un modelo de cuatro capas.
Primera capa:
La primera capa es la de aplicación y se corresponde con la
implementación real de las aplicaciones cliente y servidor. Aquí tienen lugar las
llamadas a alto nivel para acceder y exportar objetos remotos. Cualquier
aplicación que quiera que sus métodos estén disponibles para su acceso por
clientes remotos debe declarar dichos métodos en una interfazque extienda
java.rmi.Remote. Dicha interfaz se usa básicamente para "marcar" un objeto como
remotamente accesible. Una vez que los métodos han sido implementados, el
objeto debe ser exportado. Esto puede hacerse de forma implícita si el objeto
extiende la clase UnicastRemoteObject (paquete java.rmi.server), o puede
hacerse de forma explícita con una llamada al método exportObject() del mismo
paquete.
Segunda capa:
La capa 2 es la capa proxy, o capa stub-skeleton. Esta capa es la que
interactúa directamente con la capa de aplicación. Todas las llamadas a objetos
remotos y acciones junto con sus parámetros y retorno de objetos tienen lugar en
esta capa.
Tercera capa:
La capa 3 es la de referencia remota, y es responsable del manejo de la
parte semántica de las invocaciones remotas. También es responsable de la
gestión de la replicación de objetos y realización de tareas específicas de la
implementación con los objetos remotos, como el establecimiento de las
persistencias semánticas y estrategias adecuadas para la recuperación de
conexiones perdidas. En esta capa se espera una conexión de tipo stream
(stream-orientedconnection) desde la capa de transporte.
Cuarta Capa:
La capa 4 es la de transporte. Es la responsable de realizar las conexiones
necesarias y manejo del transporte de los datos de una máquina a otra. El
protocolo de transporte subyacente para RMI es JRMP (Java
RemoteMethodProtocol), que solamente es "comprendido" por programas Java.
Elementos
Toda aplicación RMI normalmente se descompone en 2 partes:
Un servidor, que crea algunos objetos remotos, crea referencias para
hacerlos accesibles, y espera a que el cliente los invoque.
Un cliente, que obtiene una referencia a objetos remotos en el servidor, y
los invoca.
Java IDL
Java IDL o Java Interface DescriptionLanguage es una implementación
CORBA que permite que dos objetos interactúen sobre diferentes plataformas a
través de una red. Java IDL al ser una interfaz permite que los objetos interactúen
sin importar el lenguaje en que estén escritos, a diferencia de Java RMI que solo
soporta objetos distribuidos escritos en Java.
Esto se logra ya que Java IDL está basado en
CommonObjectRequestBrokerageArchitecture (CORBA), un estándar para objetos
distribuidos. CORBA fue definido y está controlado por el Object Management
Group (OMG) que define las APIs, el protocolo de comunicaciones y los
mecanismos necesarios para permitir la inter operatividad entre diferentes
aplicaciones escritas en diferentes lenguajes y ejecutadas en diferentes
plataformas, lo que es fundamental en computación distribuida.
Para soportar la interacción entre objetos de programas separados, Java
IDL proporciona un ObjectRequestBroker (ORB) que es una biblioteca de clases
que permite una comunicación de bajo nivel entre aplicaciones Java IDL y
aplicaciones compatibles con CORBA.
Java Native Interface (JNI)
Java Native Interface (JNI) es un framework de programación que permite
que un programa escrito en Java ejecutado en la máquina virtual java (JVM)
pueda interactuar con programas escritos en otros lenguajes como C, C++ y
ensamblador.
El JNI se usa para escribir métodos nativos que permitan solventar
situaciones en las que una aplicación no puede ser enteramente escrita en Java,
como por ejemplo en el caso de que la biblioteca estándar de clases no
proporcione soporte para funcionalidades dependientes de la plataforma.
También se usa para modificar programas existentes escritos en algún otro
lenguaje, permitiéndoles ser accesibles desde aplicaciones Java. Muchas de las
clases de la API estándar de Java dependen del JNI para proporcionar
funcionalidad al desarrollador y al usuario, por ejemplo las funcionalidades de
sonido o lectura/escritura de ficheros. El desarrollador debe asegurarse que la API
estándar de Java no proporciona una determinada funcionalidad antes de recurrir
al JNI, ya que la primera ofrece una implementación segura e independiente de la
plataforma.
El framework JNI permite a un método nativo utilizar los objetos Java de la
misma forma en que el propio código de Java lo hace. Un método nativo puede
crear objetos Java; y examinarlos y utilizarlos para que lleven a cabo su función.
Un método nativo puede asimismo examinar y utilizar objetos que han sido
creados por código de aplicación escrito en Java.
A menudo se denomina a JNI como la "válvula de escape" para
desarrolladores dado que les permite añadir funcionalidades a sus aplicaciones
que el API de Java no puede proporcionar.
Dado que -como se ha dicho antes- puede ser usado para interactuar con
código escrito en otros lenguajes como C++, también se usa para operaciones y
cálculos de alta complejidad temporal, porque el código nativo es por lo general
más rápido que el que se ejecuta en una máquina virtual.
Conclusión
El lenguaje de programación Java tiene aplicaciones que se comunican con
la máquina virtual del mismo, y con el sistema operativo, lo cual permite a los
programadores desentenderse de la compatibilidad con el hardware. Java crea
procesos que funcionan en multitud de dispositivos.Muchos de los sitios Web y
aplicaciones no funcionan a menos que Java esté instalado. Java es rápido,
seguro y fiable. Posee un componente del entorno de ejecución que permite
ejecutar en diversos navegadores. El lenguaje de programación Java, fue
diseñado por la compañía Sun Microsystems Inc, con el propósito de crear un
lenguaje que pudiera funcionar en redes computacionales heterogéneas ( redes
de computadoras formadas por más de un tipo de computadora, ya sean PC,
MAC's, estaciones de trabajo),y que fuera independiente de la plataforma en la
que se vaya a ejecutar. Esto significa que un programa de Java puede ejecutarse
en cualquier máquina o plataforma. El lenguaje fue diseñado con las siguientes
características en mente:El sistema de Java maneja la memoria de la
computadora por ti. No te tienes que preocupar por apuntadores, memoria que no
se esté utilizando. Java realiza todo esto sin necesidad de que uno se lo indique.El
sistema de Java tiene ciertas políticas que evitan se puedan codificar virus con
este lenguaje. Portable, el código compilado de Java (conocido como byte code)
es interpretado, un programa compilado de Java puede ser utilizado por cualquier
computadora que tenga implementado el interprete de Java. Al compilar un
programa en Java, el código resultante un tipo de código binario conocido como
byte code. Este código es interpretado por diferentes computadoras de igual
manera, solamente hay que implementar un intérprete para cada plataforma. De
esa manera Java logra ser un lenguaje que no depende de una arquitectura
computacional definida. Es un lenguaje que soporta múltiplesthreads es un
lenguaje que puede ejecutar diferentes líneas de código al mismo tiempo.
Dinámico. Java no requiere que compiles todas las clases de un programa para que este funcione. Si realizas una modificación a una clase Java se encarga de realizar un DynamicBynding o un DynamicLoading para encontrar las clases.
Java puede funcionar como una aplicación sola o como un "applet", que es un pequeño programa hecho en Java. Los applets de Java se pueden "pegar" a una página de Web (HTML), y con esto puedes tener un programa que cualquier persona que tenga un browser compatible podrá usar.
Referencias Electrónicas
www.miprimercodigo.com/2012/04/entrada-y-salida-de-datos-en-java/
darkbyteblog.wordpress.com/.../java-flujos-de-datos-entrada-y-salida-est...
https://www.fdi.ucm.es/profesor/jpavon/poo/2.13.EntradaySalida.pdf
http://chuwiki.chuidiang.org/index.php?title=Serializaci
%C3%B3n_de_objetos_en_java
es.wikipedia.org/wiki/Java_Foundation_Classes
www.programacion.com/articulo/java_3d_169