I/O in Applets
Lesen von Dateien
Applets unterliegen bei Ihrem Zugriff auf Dateien gewissen
Einschränkungen (Sandbox). Deshalb darf ein (unsigniertes)
Applet auch nur auf Daten des Servers zugreifen, von dem es geladen
wurde. Um Konflikte zu vermeiden sollte deshalb für die zu
lesende Datei immer nur ein relativer Pfad verwendet werden, der beim
Lesen durch das Applet selbst komplettiert wird. Dazu ein kurzes
Beispiel:
import java.io.*;
import java.net.*;
import java.applet.*;
public class MyApplet extends Applet
{
protected BufferdReader getReader(String filename)
{
BufferedReader reader = null;
try
{
URL url = new URL (getCodeBase(), filename);
InputStream is = url.openStream();
reader = new BufferedReader(new InputStreamReader(is));
}
catch (MalformedURLException ex) {ex.printStackTrace();}
catch (IOException ex) {ex.printStackTrace();}
return reader;
}
public StringBuffer readFile(String filename)
{
StringBuffer buffer = new StringBuffer();
BufferdReader reader = getReader(filename)
String line = reader.readLine();
while (line != null)
{
buffer.append(line);
line = reader.readLine();
}
reader.close();
return buffer;
}
}
Zurückschreiben von Daten
In einigen Fällen ist es notwendig, Daten an den Server zu
senden (CGI - oder Servlet-Aufruf). Auch dies ist mit Hilfe eines
Streams, den man von der URL erhält, möglich, nur diesmal
eben ein OutputStream.
Die Beispielmethode liefert als Ergebnis die Antwort auf die gesendeten Daten.
import java.io.*;
import java.net.*;
import java.applet.*;
public class MyApplet extends Applet
{
protected String writeData(String filename, String data)
{
StringBuffer result = new StringBuffer();
try
{
URL url = new URL (getCodeBase(), filename);
UrlConncetion con = url.getConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setAllowUserInteraction(false);
OutputStream os = con.getOutputStream();
os.write(data.getBytes());
os.close();
InputStream is = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = reader.readLine();
while (line != null)
{
result.append(line);
line = reader.readLine();
}
reader.close();
}
catch (MalformedURLException ex) {ex.printStackTrace();}
catch (IOException ex) {ex.printStackTrace();}
return result.toString();
}
}
Der zurück gelieferte String kann jetzt ausgegeben werden.
HINWEIS:
Dieses Verfahren kann natürlich analog auf dem Server verwendet werden,
nur dass in diesem Fall zuerst der InputStream gelesen wird, bevor die Antwort
in den OutputStream geschrieben wird.
Lesen aus einem JAR File
Aus Performancegründen ist es sinnvoll, zusätzliche
Daten statt aus einer separaten Datei aus einem JAR-File zu lesen.
Dies spart das Öffnen einen zusätzlichen Verbindung zum
Server, zudem sind die Daten im JAR-File gepackt. Besonders wenn
mehrere Bilder gelesen werden müssen spart das eine Menge Zeit..
import java.io.*;
import java.net.*;
import java.applet.*;
public class MyApplet extends Applet
{
protected byte[] getBytesFromJar(String filename)
{
byte[] result;
try
{
InputStream is = getClass().getResourceAsStream(filename);
result = new byte[is.available()];
int i = is.read(result);
}
catch (IOException ex) {ex.printStackTrace();}
return result;
}
}
Jetzt können die Bytes verarbeitet werden (Zum Beispiel kann ein
Image
erzeugt werden, wenn es eine Graphikdatei war).