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
{
  // some other code of the 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;
  }

// Mit diesem BufferedRader kann jetzt der Inhalt der Datei zeilenweise ausgelesen werden.

   public StringBuffer readFile(String filename)
   {
     StringBuffer buffer = new StringBuffer();
     // get the reader object
     BufferdReader reader = getReader(filename)
     // and read the file line by line
     String line = reader.readLine();
     while (line != null)
       {
         buffer.append(line);
         line = reader.readLine();
       }
     // close the stream
     reader.close();
     return buffer;
   }
    // some other code of the Applet
}
	

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
{
  // some other code of the Applet

  protected String writeData(String filename, String data)
  {
    StringBuffer result = new StringBuffer();
    try
    {
      // create new URL and open a connection
      URL url = new URL (getCodeBase(), filename);
      UrlConncetion con = url.getConnection();
      // set connection attributes to handle output and input
      con.setDoOutput(true);
      con.setDoInput(true);
      con.setAllowUserInteraction(false);
      // get the OutputStream and writes the data into
      OutputStream os = con.getOutputStream();
      os.write(data.getBytes());
      os.close();
      // get the InputStream and read the response
      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();
  }

    // some other code of the Applet
}
	
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
{
  // some other code of the Applet

  protected byte[] getBytesFromJar(String filename)
  {
    byte[] result;
    try
    {
      // create InputStream
      InputStream is = getClass().getResourceAsStream(filename);
      result = new byte[is.available()];
      int i = is.read(result);
    }
    catch (IOException ex) {ex.printStackTrace();}
    return result;
  }

    // some other code of the Applet
}
	
Jetzt können die Bytes verarbeitet werden (Zum Beispiel kann ein Image erzeugt werden, wenn es eine Graphikdatei war).

Last modified at 21.08.2004 - Der Autor