# Datei lesen



## KalleM (1. Feb 2010)

Hallo,
habe ein servlet und versuche gerade ein *.txt zu lesen, um dann eventuell die daten weiter zu verarbeiten:

```
public class ExampleServlet extends HttpServlet{

       @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException, FileNotFoundException {


            Scanner scanner = new Scanner(new File("test.txt"));
		while(scanner.hasNext()){
			System.out.println(scanner.next());
		}

RequestDispatcher r = req.getRequestDispatcher("test.jsp");
        r.forward(req, resp);
    }
}
```
bekomme ständig eine filenotfound meldung. ist es nicht so, dass das root-verzeichnis der projektname ist und wenn ich die test.txt hier liegen haben, dann müsste das servlet die datei doch finden? 
würde mich über hilfe freuen.


----------



## SlaterB (1. Feb 2010)

File f = new File("test.txt");
System.out.println(f.getAbsolutePath());


----------



## KalleM (1. Feb 2010)

stelle mich wohl etwas an, komme so aber leider noch nicht weiter. nutze eclipse mit tomcat. 
erhalte dann: 
/Applications/eclipse/Eclipse.app/Contents/MacOS/test.txt


----------



## SlaterB (1. Feb 2010)

nun, dort muss also die Datei liegen, um derart zu funktionieren,
ob es anders zu konfigurieren ist kann ich persönlich nicht sagen,

eine grundsätzliche Alternative ist immer 
X.class.getResourceAsStream() 
mit einem Pfad relativ zum Ort der Datei X.class


----------



## FArt (2. Feb 2010)

Eine Datei in eines Servlet lesen ist selten eine gute Idee und oft auch nicht nötig. Was soll es denn werden, wenn es fertig ist? ;-)


----------



## KalleM (2. Feb 2010)

aus spass an der sache beschäftige ich mich mit j2ee, habe kein projekt geplant.
wollte einfach nur daten aus einer anderen quelle in eine jsp einbinden (testen, experimentieren).


----------



## FArt (3. Feb 2010)

> aus spass an der sache beschäftige ich mich mit j2ee, habe kein projekt geplant.
> wollte einfach nur daten aus einer anderen quelle in eine jsp einbinden (testen, experimentieren).


Und? Gerade dann sollte man es richtig machen... just my 2 cents...


----------



## KalleM (3. Feb 2010)

Das stimmt natürlich!
Da ich wie gesagt etwas experimentiere und mir in den letzten tagen, das ein oder andere beispiel zum Thema J2EE durchgelesen haben und noch vor einem großem Berg stehe, dachte ich mir, beginne mit kleinen Geschichten.
Nun habe ich eine Beispielanwendung gefunden (Vokabeltest) gefunden und wollte das ein oder andere mal ausprobieren, also Daten aus einer Quelle laden diese in der View darstellen und und die Antworten wieder entgegennehmen.
Wie würdest du so etwas den umsetzen? 
Nebenbei bin ich happy, das es ein Forum wie dieses gibt und nehme Ratschläge, Verbesserungsvorschläge gern' an.


----------



## FArt (3. Feb 2010)

Sinnvoll wäre es natürlich, wenn die Daten aus einer Datenbank kommen. Wenn die Daten in einer Datei gehalten werden, sollte diese mit der Applikation (oder sogar extra!) deployt werden und dann über den Classloader geladen werden. 
Hauptsache: nicht direkt über das Filesystem.


----------



## HLX (4. Feb 2010)

Bei kleinen Datenmengen mit i.d.R. lesendem Zugriff sind Text- bzw. XML-Dateien ein durchaus sinnvolles Mittel zur Datenverwaltung. Z.B. Anwendungskonfigurationen müssen nicht unbedingt in einer relationalen Datenbank gespeichert werden. 

Ich sehe außerdem nicht, was gegen den Zugriff auf das lokale Filesystem des Servers spricht. 
Wenn ich Daten zusammen mit der Anwendung deploye, muss ich bei einem Update jedesmal die Daten herauskopieren und nach dem Deployment wieder hineinkopieren, um den aktuellen Stand zu behalten. Wenn ich jedoch einen zentralen Ablageort auf dem Server bestimme, bleibt mir dieser Zusatzaufwand erspart. Wichtig ist m.E. lediglich, dass der Zugriff auf das Dateisystem nach außen verborgen wird. Ein Servlet darf keine Rückschlüsse darauf liefern, wo die Daten abgelegt sind.


----------



## FArt (4. Feb 2010)

> Ich sehe außerdem nicht, was gegen den Zugriff auf das lokale Filesystem des Servers spricht.


Eine (wie auch immer geartete) Enterpriseapplikation sollte keine Abhängigkeiten außerhalb des Laufzeitkontextes haben. Diese Abhängigkeiten machen Probleme (Fehlerquellen, Aufwand) in der Wartung und beim Deployment in unterschiedlichen Umgebungen (Entwicklung, QS, Produktion) und machen es oft praktisch unmöglich, die Applikation sinnvoll zu skalieren.

Zugriffe auf solche Ressourcen sollten über passende Adapter (ResourceAdapter) gekapselt und abstrahiert werden.
The J2EE Connector Architecture's Resource Adapter, für Files z.B. mit
File Resource Adapter | Get File Resource Adapter at SourceForge.net


----------



## Mole23 (4. Feb 2010)

Wenn es nur darum geht ein file zu lesen und in der Console auszugeben, hätte ich folgende Lösung am Start: Evtl. besteht ja Interesse... 


```
package Datenbank;

import java.io.*;
class FileRead 

{
   public static void main(String args[])
  {
    try{
    
    FileInputStream einlesen = new FileInputStream("C:\\test.txt");

    DataInputStream in = new DataInputStream(einlesen);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    
    String inhalt;
    while ((inhalt = br.readLine()) != null)   {
     
    System.out.println(inhalt);
    }

    in.close();
    
    }catch (Exception e){
      System.err.println("Error: " + e.getMessage());
    }
  }
}
```


----------



## FArt (4. Feb 2010)

Mole23 hat gesagt.:


> Wenn es nur darum geht ein file zu lesen und in der Console auszugeben, hätte ich folgende Lösung am Start: Evtl. besteht ja Interesse...
> 
> 
> ```
> ...



Sicher doch! Ich verstehe gar nicht, warum noch keiner auf diese grandiose Idee gekommen ist! *Hand-vors-Hirn-hau*


----------

