Veamos cómo se comporta esta aplicación si la modificamos para usarla como applet.
/*
Archivo: Ejemplo12.java
*/
import java.io.*;
import java.awt.*;
import java.applet.*;
public class Ejemplo12 extends Applet {
public void init() {
}
}
/*
Esta clase es la que en realidad hace el trabajo
*/
class Ventana12 extends Frame {
TextArea contenido;
Button cerrar;
Ventana12() {
super("Ejemplo de E/S");
contenido = new TextArea();
cerrar = new Button("Cerrar");
CargarArchivo();
add("North",contenido);
add("South",cerrar);
pack();
show();
}
public boolean handleEvent(Event e) {
if ((e.id
Event.WINDOW_DESTROY)||(e.target
cerrar))
dispose();
return super.handleEvent(e);
}
void CargarArchivo() {
FileInputStream fptr;
DataInputStream f;
String linea = null;
try {
fptr = new FileInputStream("Ejemplo12.java");
f = new DataInputStream(fptr);
do {
linea = f.readLine();
if (linea!=null)
contenido.appendText(linea+"\n");
} while (linea != null);
fptr.close();
}
catch (FileNotFoundException e) {
contenido.appendText("Hey, ese archivo no existe!\n");
}
catch (IOException e) {
contenido.appendText("Error de E/S!\n");
}
}
}
Lo cargamos desde la página Ejemplo12.html:
<HTML>
<HEAD>
<TITLE>Ejemplo 12 - Ejemplo con archivo</TITLE>
</HEAD>
<BODY>
<applet code="Ejemplo12.class" width=170 height=150>
</applet>
</BODY>
</HTML>
Mientras corramos esto en la misma máquina, no hay problema (anda muy bien!). Pero qué pasa si intentamos cargarlo desde la red? Para los que no tengan server html puse una copia en:
http://www.amarillas.com/rock/java/Ejemplo12.htm---
El archivo no aparece! En su lugar se produce una excepción; en la línea de estado del Microsoft Internet Explorer, por ejemplo, se lee:
exception: com.ms.applet.AppletSecurityException: security.file.read: Ejemplo12.java
Esto es debido a una restricción de seguridad de Java: NO SE PUEDEN CARGAR ARCHIVOS QUE ESTEN EN UNA MAQUINA DISTINTA A AQUELLA DESDE LA CUAL SE CARGO EL APPLET. El applet se corre en el cliente, e intenta acceder a un archivo local. Eso es lo que provoca la excepción (que, por supuesto, puede detectarse con un catch y tratarse...)
Por cuestiones de seguridad, los applets son más limitados que las aplicaciones Java locales. Las políticas de seguridad las manejan los browsers (no Java), y generalmente los límites que se imponen a los applets son:
- Un applet no puede cargar bibliotecas (libraries) ni definir métodos nativos
- No puede leer o escribir normalmente archivos en el cliente que lo carga desde otro server
- No puede establecer conexiones de red, salvo al servidor del que proviene
- No puede arrancar programas en la máquina donde se está ejecutando
- No puede leer ciertas propiedades del sistema
- En las ventanas de los applets se indica que se trata de un applet
Sin embargo, pueden:
- Reproducir sonidos
- Pueden establecer conexiones con el servidor del que provienen
- Pueden llamar fácilmente páginas HTML desde el browser
- Pueden invocar métodos públicos de otros applets de la misma página
- Si se cargan desde la propia máquina (localmente) no tienen ninguna de las restricciones anteriores
- Pueden seguir corriendo aunque se cambie de página en el browser
En realidad, la especificación de Java permite que los applets lean archivos en otras máquinas dando la URL completa; sin embargo, los browsers no lo permiten. Veremos más adelante cómo intercambiar datos entre máquinas para poder ver un archivo del server, por ejemplo.