# JFilechooser: gewählte Datei in mein FileReader übergeben



## runT (23. Aug 2007)

Hallo Jungs,

Ich wollte Euch mal fragen, ob mir jemand an meinem Problem weiterhelfen könnte. Ich stecke hier nämlich in  einer Sackgasse und komme nicht mehr weiter. Worum gehts? Ich habe eine JTable programmiert, die funktioniert einwandfrei, aber diese JTable muss mit Daten gefüttert werden. Jene Daten werde ich mit einem JFileChooser auf die gewählte Datei (z.B C:\beispiel.csv) klicken und diese Datei dem FileReader übergeben. Leider sind beide Konstrukte (JFilechooser und JTable) in separaten Klassen, aber hab eine get-Methode gebastelt welche auf die andere Klasse referenziert und aufgerufen wird. Leider erhalte ich immer eine NullPointerException.

Jetzt weiss ich nicht ob ich beide Klassen hier posten sollte, sodass ihr eben ein besseres Bild habt. Da es viele Zeilen sind, nehme ich einfach die wichtigsten Klassen daraus..... vielleicht sieht ihr ja einen Fehler welcher Ich nicht sofort sehe.... 

Codes aus der Klasse Analyse.java:

```
public void read(){
    
      try {
        BufferedReader eingabe = new BufferedReader(new FileReader(pFile)); //hier wird die gewählte Datei als Stream-Ausgabe in die JTable übertragen
        // BufferedReader eingabe = new BufferedReader(new FileReader(pFile)); //hier wird die gewählte Datei als Stream-Ausgabe in die JTable übertragen
```

Und hier die Klasse FileHandler:

```
public class FileHandler extends JFrame {
    
   public File file;
    
    /** es wird eine Instanz der Klasse FileHandler erzeugt */
    public FileHandler() {
    
    super("Datei Öffnen");
    //fileHandler();
  }
    
    public void fileHandler() {
        
    
    JFileChooser fc = new JFileChooser(); 
    fc.setFileFilter( new FileFilter() 
    { 
      @Override public boolean accept( File f ) 
      { 
        return f.isDirectory() || 
          f.getName().toLowerCase().endsWith( ".csv" ); 
      } 
      @Override public String getDescription() 
      { 
        return ".csv"; 
      } 
    } ); 
 
    int state = fc.showOpenDialog( null ); 
 
    if ( state == JFileChooser.APPROVE_OPTION ) 
    { 
       
      File file = fc.getSelectedFile();
      getFile();
    
    else 
      System.out.println( "Auswahl abgebrochen" );
   //return file;
    }

    
    public File getFile() {
        return file;
    }
 
  
 
}
```


Und hier meine Action-Command was passiert wenn das Menu-item Datei öffnen geklickt wird 
Die Codezeile innerhalb der Klasse Analyse.java:

```
public void actionPerformed(java.awt.event.ActionEvent ev){
            String cmd = ev.getActionCommand();
            if (cmd.equals("Datei öffnen")) {
                FileHandler openfile = new FileHandler(); //Objekt erzeugen
                openfile.getFile();
                openfile.setVisible(true);
            }
    }[code]

Eben, wenn ich doch noch beide Klassen komplett posten sollte, gebt mir doch Bitte Bescheid. Ich hab so gut wie möglich die Codezeilen genommen, die relevant sind um mein kleines Projekt funktionsfähig zu machen.

Gruss an alle Java-Freunde...

Rob
```


----------



## André Uhres (23. Aug 2007)

Bitte poste erstmal die ersten paar Zeilen der ursprünglichen Fehlermeldung (originalgetreu :wink: ).


----------



## runT (23. Aug 2007)

Hi,

Erstmal Danke für deine Antwort. Ich hoffe ich hab dich soweit verstanden, dass du die Fehlermeldung sehen möchtest?

Und sonst halt kann ich noch nachträglich die Codezeilen hinzufügen, da der Fehler eigentlich beim File-und BufferedReader stattfindet siehe unten:
_
init:
deps-jar:
compile-single:
run-single:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.io.FileInputStream.<init>(FileInputStream.java:103)
        at java.io.FileReader.<init>(FileReader.java:55)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.read(Analyse.java:327)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.<init>(Analyse.java:88)
        at ch.sbb.P_OP_RFT.DamoXP.DamoclesXPGui.actionPerformed(DamoclesXPGui.java:424)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
.................................. etc.... 
_




greetz,

Rob[/quote]


----------



## André Uhres (24. Aug 2007)

runT hat gesagt.:
			
		

> ..at ch.sbb.P_OP_RFT.DamoXP.Analyse.read(Analyse.java:327)..


Bitte sag den genauen Inhalt der Zeile Analyse.java:*327 * und poste die Analyse.read Methode.


----------



## runT (24. Aug 2007)

Hi

Hier mal was hinter der Zeile 327 ,es referenziert auf den folgenden Code:

```
BufferedReader eingabe = new BufferedReader(new FileReader(pFile)); //hier wird die gewählte Datei als Stream-Ausgabe in die JTable übertragen
```

und hier noch meine Read-Methode:

```
//Die Read-Methode holt sich die Daten, welche vom Benutzer ausgewählt worden sind. Dies wird mit 
 //der multiDateiAuswahl - Methode bewerkstelligt.  
 public void read(){
    
      try {
        BufferedReader eingabe = new BufferedReader(new FileReader(pFile)); //hier wird die gewählte Datei als Stream-Ausgabe in die JTable übertragen
        // BufferedReader eingabe = new BufferedReader(new FileReader(pFile)); //hier wird die gewählte Datei als Stream-Ausgabe in die JTable übertragen
         int gelesen;
         String eingabezeile;

         eingabezeile=eingabe.readLine();

         input = new Vector(); // #### in diesem Vector speichern

         while( eingabezeile != null )
         {
            StringTokenizer token= new StringTokenizer (eingabezeile);

            String[] felder =eingabezeile.split(";");
           /*
            Vector row = new Vector();
            for (int i=0;i<felder.length;i++){
                row.addElement(felder[i]);
            }
            */

            StringBuffer text =new StringBuffer(10);
            input.add( felder );
            eingabezeile=eingabe.readLine();
         }
         
 /*    
         Object rowData[][] = (Object[][])input.toArray( new Object[ input.size() ][] );
         Arrays.sort(rowData,1,890,new NameCoperator());

         
         String columnNames[] = {"Datum/Uhrzeit", "FLG", "Störungsmeldung"};

         table.setModel( new StringTableModel( rowData, columnNames ));
                 

     */         
      }
      catch( IOException ex ){
         ex.printStackTrace();
      }
     
    
  }
```

Hoffe auf eine Lösung.. und schon mal super-Dank für die Antwort auf meine Posts... 

Gruss aus der Schweiz,

Rob


----------



## André Uhres (24. Aug 2007)

Versuch mal dies zu ändern:

```
File file = fc.getSelectedFile();
```
so:

```
file = fc.getSelectedFile();
```


----------



## runT (25. Aug 2007)

Salü.....

Hab dies geändert....  aber es erscheint mir immer noch eine Fehlermeldung...... es ist die gleiche Meldung wie vorhin: 

_Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.io.FileInputStream.<init>(FileInputStream.java:103)
        at java.io.FileReader.<init>(FileReader.java:55)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.read(Analyse.java:327)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.<init>(Analyse.java:88)
        at ch.sbb.P_OP_RFT.DamoXP.DamoclesXPGui.actionPerformed(DamoclesXPGui.java:424)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
_

Aber es kann ja nicht sein, dass es am Übergabe-Parameter liegt, da ich ja dort nicht die gleiche Variable benutze, die ich mit meiner get-File Methode hole ... die get-Methode habe ich eben in meiner FileHandler - Klasse drin. um dann das File an den FileReader zu übergeben... schau hier:


```
public File getFile() {
        return file;
    }
```

Hättest du da noch eine Idee woran es liegen könnte?

Gruss...

Rob :roll:


----------



## MarcoBehnke (25. Aug 2007)

```
if ( state == JFileChooser.APPROVE_OPTION )
    {
       
      File file = fc.getSelectedFile();
      getFile();
   
    else
      System.out.println( "Auswahl abgebrochen" );
   //return file;
    }
```

Du musst wahrscheinlich den Rückgabewert von getFile() auch irgendwo abspeichern?!
Sonst bringt es Dir ja gar nix, dort getFile() aufgerufen zu haben.


----------



## runT (25. Aug 2007)

Hallo...

Sorry, war mein Fehler... hab was versuchen wollen. Aber die get-File Methode müsste hier nicht drin stehen. Ich hab nämlich die get-File Aufruf vergessen, rauszunehmen. Der  Aufruf geschieht nämlich in der Klasse Analyse, welche den FileHandler auruft mit der Methode get-File um das File dann dem FileReader zu übergeben.


```
if ( state == JFileChooser.APPROVE_OPTION ) 
    { 
       
      file = fc.getSelectedFile();
      getFile();
  }
    
    else 
      System.out.println( "Auswahl abgebrochen" );
   //return file;
    }
```

sondern so muss es eigentlich sein:

```
if ( state == JFileChooser.APPROVE_OPTION ) 
    { 
       
      file = fc.getSelectedFile();
 }
    
    else 
      System.out.println( "Auswahl abgebrochen" );
   //return file;
    }
```

und eben dann noch anschliessend, die get-File Methode, dich ich ja unbedingt brauche um das file zu holen:

```
public File getFile() {
        return file;
    }
```

Sorry, wegen dem Fehler...

Rob :wink:


----------



## runT (25. Aug 2007)

Echt strange... aber irgendwie kommt immer die gleiche Fehlermeldung...   mit dem initialisieren....  und kann halt die Methoden nicht starten..... obwohl die Methode ja initialisiert werden.

Vielleicht sieht trotzdem etwas was verbessert werden müsste...

Thanks für die Inputs.

Gruss,

Rob


----------



## MarcoBehnke (25. Aug 2007)

also ich kann deinem code immer noch nicht entnehmen, an welcher Stelle

pFile

instanziert wird.


----------



## runT (25. Aug 2007)

Hi...

die variable pFile wird hier instanziert, wo alle Anderen Variablen instanziert werden:


```
public class Analyse extends JFrame implements ActionListener {
    
    //Variablen Deklaration resp. Instanzieren der Variablen
    private JTable table;
    private FileHandler openfile;
    private File pFile;     //Datei-Übergabe an den FileReader (Daten-Typ muss File sein)           
    private javax.swing.JTextArea AnalyseDatenInformation;
    ......... etc etc....
```

Rob


----------



## MarcoBehnke (25. Aug 2007)

nee, da wird sie deklariert. An welcher Stelle wird die instanziert?

pFile = new File............

wenn auif pFile niemals wie auch immer ein Object instanziert wird, dann wundert es mich nicht, dass es eine NullPOinterException im FileInputStream gibt

BufferedReader eingabe = new BufferedReader(new FileReader(pFile))


----------



## runT (25. Aug 2007)

Ja... unglaublich...

hab ich voll verschwitzt, hab nicht darauf geachtet! Ich bin davon ausgegangen, nebst meiner Variablen-Deklaration noch zusätzlich ein File-Objekt auf die pFile - Variable instanziert worden ist. In der Hitze des Gefechts untergegangen.... kann ja passieren....

Anyway zurück.. zu meinem Code....  jetzt möchte ich ja auf meine pFile Variable einen Objekt des Typ File instanzieren.... aber eben ich möchte keinen FileWriter benutzen, da ich ja die bestehende Datei mit einem JFileChooser(FileHandler -Klasse) öffne und dem FileReader (Analyse-Klasse) übergebe. Geht das so mit 
	
	
	
	





```
pFile = new File();
```
Nicht zu vergessen ist, dass ein Wert mit meiner get-Methode zurückgegeben wird und dies dann innerhalb der Analyse-Klasse mit der Get-Methode aufgerufen wird.

Ich weiss es ist keine triviale Übung, aber ich muss es so lösen.

Danke für's Feedback.

Rob[/code]


----------



## runT (25. Aug 2007)

Ok, 
Ich hab noch was versucht, die Variable von pFile nach file zu ändern (Deklaration auch angepasst natürlich) und schliesslich noch auf diese Varialbe mit dem File-Objekt instanziert. So sieht das aus:


```
try {
        file = new File("");  
        BufferedReader eingabe = new BufferedReader(new FileReader(file)); //hier wird die gewählte Datei als Stream-Ausgabe in die JTable übertragen
```

Jetzt kommt eine andere Fehlermeldung auf... keine NullPointerException aber eine FileNotFound... obwohl ich nicht einmal mein FileDialog gesehen habe um die Datei zu öffnen. Ich bin sicher irgendwas fehlt noch innerhalb der FileHandler - Klasse....  aber momentan kommt mir keine Idee in den Sinn... wisst Ihr was?

Fehler: _java.io.FileNotFoundException: 
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileReader.<init>(FileReader.java:55)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.read(Analyse.java:344)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.<init>(Analyse.java:92)
_

Rob


----------



## MarcoBehnke (25. Aug 2007)

file = new File(""); 
        BufferedReader eingabe = new BufferedReader(new FileReader(file));


die Datei "" gibt es nunmal auch nicht


----------



## runT (25. Aug 2007)

Hast vollkommen recht, ich hab dies eher als Lückenfüller angeschaut ..  ich möchte einfach den gespeicherten Wert, welcher ja in der get-Methode zurückgegeben wird, holen und diesen dem FileReader übergeben. 

Schade finde ich, dass beim File Konstrukt unbedingt ein Dateinamen angegeben werden muss. Ausser es gibt doch noch eine Variante, wie man es schlauer machen könnte.



Rob


----------



## MarcoBehnke (25. Aug 2007)

Du musst ganz einfach dafür sorgen, dass du die Methode mit dem Stream erst dann aufrufst, wenn Du mit dem Filechooser einen Dateinamen an der Hand hast


----------



## runT (30. Aug 2007)

Hi...

Danke für deine Antwort und sorry für meine Verspätete Rückantwort... da ich noch Stress habe an einer Semesterarbeit. 

Also ich habe jetzt die Read() - methode.. welche den Stream enthält erst nachdem ich die Datei ausgewählt habe. Aber leider kann er immer noch nichts anfangen und kommt mit einem Error:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.io.File.<init>(File.java:222)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.read(Analyse.java:351)
        at ch.sbb.P_OP_RFT.DamoXP.Analyse.actionPerformed(Analyse.java:338)


Nun habe ich meine Read() - Methode von der Analyse-Klasse in meine FileHandler - Klasse gemoved...  und nun habe ich eine Typenumwandlungsproblem.

Anschliessend sollte eine Read() Methode  aufgerufen werden und die file - Variable weiterreichen. Leider wissen wir, dass das meine Variable file von einem Typ File ist. Geht ein casten von File in String? Könnt Ihr mir ein Beispiel evtl. geben?

Der nachfolgende Code ist dazu gedacht, um die gewählte Datei in die instanzierte Variable file zuzuweisen. 

```
file = fc.getSelectedFile();
```

Und hier meine Variablen - Deklaration:


```
public class FileHandler extends JFrame {
    
   public File file;
   public String pFile;
```


Eins verstehe ich auch nicht... steht die add-Methode nicht global für alle Klassen zur Verfügung...  bei mir kommt bei der folgenden Codezeile ständig ein syntaktischer Fehler... add - Methode can not find symbol...  Irgendwelche Hinweise?

Danke für Eure Hilfe

Gruss

Rob


----------

