📄 java10.htm
字号:
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");
}
}
}<BR>
</FONT>
</PRE>
<P>
Lo cargamos desde la página Ejemplo12.html:
<PRE>
<FONT SIZE=2><HTML>
<HEAD>
<TITLE>Ejemplo 12 - Ejemplo con archivo</TITLE>
</HEAD>
<BODY>
<applet code="Ejemplo12.class" width=170 height=150>
</applet>
</BODY>
</HTML><BR>
</FONT>
</PRE>
<P>
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:
<P>
http://www.amarillas.com/rock/java/Ejemplo12.htm<BR>
<P>
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:
<PRE>
<FONT SIZE=2>exception: com.ms.applet.AppletSecurityException: security.file.read: Ejemplo12.java
<BR>
</FONT>
</PRE>
<P>
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 <FONT FACE="Arial">catch</FONT> y tratarse...)<BR>
<P>
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:
<UL>
<LI>Un applet no puede cargar bibliotecas (libraries) ni definir
métodos nativos
<LI>No puede leer o escribir normalmente archivos en el cliente
que lo carga desde otro server
<LI>No puede establecer conexiones de red, salvo al servidor del
que proviene
<LI>No puede arrancar programas en la máquina donde se
está ejecutando
<LI>No puede leer ciertas propiedades del sistema
<LI>En las ventanas de los applets se indica que se trata de un
applet
</UL>
<P>
<P>
Sin embargo, pueden:
<UL>
<LI>Reproducir sonidos
<LI>Pueden establecer conexiones con el servidor del que provienen
<LI>Pueden llamar fácilmente páginas HTML desde
el browser
<LI>Pueden invocar métodos públicos de otros applets
de la misma página
<LI>Si se cargan desde la propia máquina (localmente) no
tienen ninguna de las restricciones anteriores
<LI>Pueden seguir corriendo aunque se cambie de página
en el browser
</UL>
<P>
<P>
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.<BR>
<H2>Nuestro modesto "Editor"</H2>
<P>
Para terminar este capítulo, el siguiente applet nos permite
cargar, editar y grabar archivos ascii a elección. Podemos
usar inclusive las acciones "cut & paste" del windows
manager (Ctrl-C y Ctrl-V en Windows)!
<P>
Cargarlo con "<FONT FACE="Arial">appletviewer Ejemplo13</FONT>"
luego de haberlo compilado (o usar una página html desde
un browser):
<P>
<BR>
<PRE>
<FONT SIZE=2>/*
// ----- Archivo: Ejemplo13.java
*/
import java.io.*;
import java.awt.*;
import java.applet.*;
public class Ejemplo13 extends Applet {
public void init() {
new Ventana13();
}
}
/*
// -------- Esta clase es la que en realidad hace el trabajo
*/
class Ventana13 extends Frame {
TextArea contenido;
Botones13 pieVentana;
Ventana13() {
super("Ejemplo de E/S");
contenido = new TextArea();
pieVentana = new Botones13();
add("North",contenido);
add("South",pieVentana);
pack();
show();
}
public boolean handleEvent(Event e) {
if ((e.id==Event.WINDOW_DESTROY)||(e.id==2003))
dispose();
if (e.id==2001) CargarArchivo(pieVentana.toString());
if (e.id==2002) GrabarArchivo(pieVentana.toString());
return super.handleEvent(e);
}
void CargarArchivo(String nombre) {
FileInputStream fptr;
DataInputStream f;
String linea = null;
contenido.setText("");
try {
fptr = new FileInputStream(nombre);
f = new DataInputStream(fptr);
do {
linea = f.readLine();
if (linea!=null) contenido.appendText(linea+"\n");
} while (linea != null);
fptr.close();
}
catch (FileNotFoundException e) {
new Error13("El archivo no existe!");
}
catch (IOException e) {
new Error13("Error leyendo archivo!");
}
}
void GrabarArchivo(String nombre) {
FileOutputStream fptr;
DataOutputStream f;
try {
fptr = new FileOutputStream(nombre);
f = new DataOutputStream(fptr);
f.writeBytes(contenido.getText());
fptr.close();
}
catch (IOException e) {
new Error13("Error grabando archivo!");
}
}
}
/*
// -------- Esta es para los botones y el nombre del archivo
*/
class Botones13 extends Panel {
TextField fname;
Button cargar;
Button grabar;
Button cerrar;
Botones13() {
setLayout(new GridLayout(1,4));
fname = new TextField();
cargar = new Button("Cargar");
grabar = new Button("Grabar");
cerrar = new Button("Cerrar");
add(new Label("Archivo:"));
add(fname);
add(cargar);
add(grabar);
add(cerrar);
}
public boolean handleEvent(Event e) {
if ((e.id==Event.ACTION_EVENT)&&(e.target==cargar))
e.id=2001;
if ((e.id==Event.ACTION_EVENT)&&(e.target==grabar))
e.id=2002;
if ((e.id==Event.ACTION_EVENT)&&(e.target==cerrar))
e.id=2003;
return super.handleEvent(e);
}
public String toString() {
return fname.getText();
}
}
/*
// ------- Para mostrar los errores...
*/
class Error13 extends Frame {
Error13(String error) {
add("Center",new Label(error));
add("South", new Button("Ok"));
pack();
show();
}
public boolean handleEvent(Event e) {
dispose();
return super.handleEvent(e);
}
}<BR>
<BR>
</FONT>
</PRE>
<P>
Un poco largo... pero vale la pena, ¿no?!
<P>
Nos vemos en el próximo capítulo...<BR>
<BR>
<BR>
<P>
Jorge Bourdette
<P>
<A HREF=mailto:jpb@amarillas.com>jpb@amarillas.com</A>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -