30. Juli 2010  
  Suche:
 
  Basics
  Code-Galerie
  Forum
  FAQ
  Tipps & Tricks
  Literatur
  Knowledge Base
  Workshops
  JSP-Hosting
  JSP-Engines
  Jobbörse
  Links
  JSP-Sites
  Newsletter
  JSP-Test
  Impressum
  Username:
  
  Passwort:
  
  

  Jetzt registrieren
  Warum registrieren?

  Valid HTML 4.01!
  Valid CSS!

FAQ (Frequently Asked Questions)

7. Dateien

7.1

Wie kann ich eine Datei mit JSP auslesen und deren Inhalt darstellen?
Die Dateiein- und -ausgabe ist in Java durch so genannte Streams realisiert. Unter einem Stream versteht man zunächst ein abstraktes Konstrukt, das in der Lage ist, Zeichen auf ein imaginäres Ausgabegerät zu schreiben oder von diesem zu lesen. Die Anbindung an ein konkretes Ausgabegerät erfolgt durch Unterklassen. Für das Einlesen von Dateien ist dies die Klasse FileReader.

Einen FileReader kann man wie folgt konstruieren:
  - Mit einer String, der den Namen der zu &öffnenden Datei enthält.
    FileReader f = new FileReader(String name)

  - Mit einem File-Objekt, das die zu öffnende Datei repräsentiert.
    FileReader f = new FileReader(File file)

  - Mit einem FileDescriptor-Objekt, das eine bereits geöffnete Datei repräsentiert.
    FileReader f = new FileReader(FileDescriptor fd)

Dabei ist zu beachten, dass in den ersten beiden Fällen eine FileNotFoundException ausgelöst wird, wenn die spezifizierte Datei nicht existiert. Im Erfolgsfall kann über die read-Methode des FileReader das Einlesen erfolgen. Dabei wird stets das nächste Zeichen als int zurückgeliefert. Das Ende des Streams wird durch -1 gekennzeichnet. Die Ausgabe erfolgt über die print-Methode des out-Objektes, das innerhalb der JSP implizit zur Verfügung steht. Wichtig ist, dass der int-Wert des Zeichens in den Datentyp char gecastet wird. Nach Beendigung der Ausgabe, wird der FileReader per close-Methode geschlossen. Etwaige Probleme während des Lesevorgangs resultieren in einer IOException, die abgefangen werden muss. Das folgende Listing zeigt die Anwendung des FileReader in einer JSP:

<%@page language="Java" contentType="text/html" %>
<%@page import="java.io.*" %>
<%
  FileReader reader = null;
  int c;
  File file = new File(pathToFile);

  try {
 
  reader = new FileReader(file);
  while ((c = reader.read()) != -1) {
    out.print((char)c);
  }
  }
  catch(FileNotFoundException fileNotFound) {
    out.print("Die Datei existiert nicht.");
  }
  catch(IOException ioErr) {
    out.print("Bei der Ausgabe ist ein Fehler aufgetreten.");
  }
  finally {
  if (reader != null) {
    reader.close();
  }
  }
%>

Das obige Beispiel erfüllt zwar unsere Grundanforderungen, ist aber nicht sonderlich performant, da immer nur ein Zeichen gelesen wird. Die Performance lässt sich durch den Einsatz eines BufferedReader verbessern. Da Java die Schachtelung von Streams ermöglicht kann man den BufferedReader einfach mit Hilfe des FileReaders konstruieren. Außerdem bietet der BufferedReader die readLine-Methode, die das Einlesen zeilenweise durchführt. Das folgendene Listing zeigt den Einsatz des BufferedReader:

<%@page language="Java" contentType="text/html" %>
<%@page import="java.io.*" %>
<%
  BufferedReader reader = null;
  String line;
  File file = new File(pathToFile);

  try {
 
  reader = new BufferedReader(new FileReader(file));
  while ((line = reader.readLine()) != null) {
    out.print(line);
  }
  }
  catch(FileNotFoundException fileNotFound) {
    out.print("Die Datei existiert nicht.");
  }
  catch(IOException ioErr) {
    out.print("Bei der Ausgabe ist ein Fehler aufgetreten.");
  }
  finally {
  if (reader != null) {
    reader.close();
  }
  }
%>

Autor: matbtt

 
7.2

Wie schreibe ich den Output einer JSP in eine Datei?
Diese Aufgabe lässt sich auf mehreren Wegen lösen. Denkbar wären bspw. ein eigens geschriebener Tag oder ein spezieller Filter. Das folgende Beispiel beschränkt sich auf die Implementierung mittels eines eigenen Tags.
Die Idee ist, dass der Tag den gesamten Inhalt einer JSP umschließt und nach dessen Abarbeitung den Output vor dem Senden an den Client in eine Datei schreibt. Um dies zu realisieren, erzeugen wir eine Klasse, die die Klasse BodyTagSupport aus dem Package javax.servlet.jsp.tagext erweitert. BodyTagSupport stellt spezielle Methoden zur Verfügung, die es dem Entwickler erlauben, Zugriff auf den Inhalt eines Tags zu erlangen.
Für die Implementierung der Funktionalität machen wir uns die Methode doAfterBody zu nutze. Diese wird aufgerufen, wenn der Inhalt des Tags abgearbeitet wurde, in unserem Fall also genau ein Mal. Das folgende Listing zeigt das entsprechende Coding:

public int doAfterBody() throws JspTagException {
  try { 
  BodyContent body = getBodyContent();
  if (body != null) {
    FileWriter fout = new FileWriter (pathToFile));
    body.writeOut(fout);
    body.writeOut(body.getEnclosingWriter());
    fout.close();
  }
  }
  catch(IOException ioe) {}
  return SKIP_BODY;
}

Über die Methode getBodyContent beschafft man sich den Inhalt des Tags, der durch ein Objekt der Klasse BodyContent repräsentiert wird. Wenn es einen Inhalt gibt, wird ein FileWriter erzeugt. Über die Methode writeOut des BodyContent-Objektes wird der gesamte Inhalt zunächst in den FileWriter geschrieben. Danach erfolgt der eigentliche Output, indem wiederum über writeOut in den Ausgabestream der JSP geschrieben wird. Die Methode sollte SKIP_BODY zurückgeben, um eine erneute Verarbeitung des Tag-Inhaltes zu unterbinden.

Autor: matbtt

 
7.3

Wie kann ich eine Datei mit JSP löschen?
Für das Handling von Dateien und Verzeichnissen stellt Java die File-Klasse zur Verfügung. Zum Löschen einer, durch ein File-Objekt repräsentierten Datei bzw. eines Verzeichnis, wird die delete-Methode genutzt. Dabei sind folgende Einschränkungen zu beachten. Zunächst müssen zu löschende Verzeichnisse leer sein. Weiterhin müssen dem Benutzer, unter dem die Servlet-Engine läuft, entsprechende Rechte eingeräumt werden. Für den Fall, dass sämtliche Dateioperationen durch einen SecurityManager überwacht werden, muss eine möglicherweise auftretende SecurityException entsprechend behandelt werden. Das folgende Listing zeigt, den Einsatz der delete-Methode. Ob der Löschvorgang erfolgreich war, wird anhand des Rückgabewertes vom Typ boolean entschieden:

<%@page language="Java" contentType="text/html" %>
<%@page import="java.io.File" %>
<%
  File file = new File(pathToFile);
  boolean deleted = file.delete();
  if (deleted) {
    out.print("Datei gelöscht.");
  }
  else {
    out.print("Datei nicht gelöscht.");
  }
%>

Autor: matbtt

 

Zurück


Hinweis: Auf dieser Seite liegen Links zu anderen Seiten im Internet. Für alle diese Links gilt: Wir betonen ausdrücklich, daß wir keinerlei Einfluß auf die Gestaltung und die Inhalte der gelinkten Seiten haben. Deshalb distanzieren wir uns hiermit ausdrücklich von allen Inhalten aller gelinkten Seiten auf dieser Homepage und machen uns ihre Inhalte nicht zueigen. Diese Erklärung gilt für alle auf unserer Homepage angebrachten Links

Redaktion/Betreiber von JSP-Develop übernehmen keinerlei Gewährleistung und Verantwortung für die Richtig- und/oder Vollständigkeit von den auf den Webseiten JSP-Develop veröffentlichten Source Codes. Die Verantwortung der Verwendung/Anwendung sowie etwaige Modifikation der hier veröffentlichten Sourcen obliegt einzig dem Benutzer der Webseite, welche die veröffentlichten Sourcen in einer Applikation/Anwendung einsetzt. Durch das Kopieren und/oder Benutzen der Sourcen in einer Applikation/Anwendung bzw. etwaigen Abschriften wird dieser Rechtshinweis anerkannt.

Java, JSP, JavaServer Pages, J2EE, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and in other countries. IBM, WebSphere are trademarks or registered trademarks of International Business Machines Corporation. Other trademarks and registered trademarks are the property of their respective owners.