2017-12-22 9 views
0

Ich versuche, eine Basisdatei Plugin, das andere Threads erben zu machen. Aber ich bin an einem Punkt fest, wo die Datei existiert und kann von einem normalen Thread gelesen werden, aber wenn ich versuche, diese Datei aus einer abstrakten Basisdatei zu lesen, heißt es, dass Datei nicht gefunden wurde. Hier ist meine Basisklasse: -Datei kann nicht von der abstrakten Klasse lesen

package com.evol.fp; 

    import java.io.BufferedReader; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.io.PrintWriter; 

    public abstract class BaseFilePlugin extends Thread implements BaseFileReader{ 

     String filename = ""; 
     File file = null; 
     boolean fileStarted = false; 
     boolean fileEnded = false; 

     public BaseFilePlugin() { 
      file = new File(filename); 
     } 

     public void readFile() { 
      BufferedReader br = null; 
      System.out.println("Base call: " + filename); 
      try { 

       System.out.println("inbside "); 
       br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
       if(br.readLine().trim().isEmpty()) { 
        endFile(); 
        return; 
       } else { 
        startFile(filename); 
        String record; 
        while((record = br.readLine().trim()) != null) { 
         parseRecord(record); 
        } 
        endFile(); 
       } 
      } catch(Exception ioe) { 
       ioe.printStackTrace(); 
      } finally { 
       try { 
        br.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     public abstract void parseRecord(String record); 

     public void startFile(String filename) { 
      this.fileStarted = true; 
      this.fileEnded = false; 
     } 

     public void endFile() { 
      file.delete(); 
      this.fileEnded = true; 
      this.fileStarted = false; 
     } 

     public void run() { 
      while(true) { 
       System.out.println("Inside run, fileName: " + filename); 
       System.out.println("Filestarted: " + fileStarted + ", file exists: " + file.exists()); 
       if(!fileStarted) { 
        readFile(); 
       } 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     /** 
     * @return the filename 
     */ 
     public String getFilename() { 
      return filename; 
     } 

     /** 
     * @param filename the filename to set 
     */ 
     public void setFilename(String filename) { 
      this.filename = filename; 
     } 

    } 

Ich bin mir bewusst, Multithreading, aber nie mit der Basisklasse implementiert zu analysieren Datensätze aus einer Datei, wenn mir jemand sagt, was das Problem ist, dass groß sein. Ich weiß, dass die Datei sicher existiert. Hier ist mein Kind Klasse: -

package com.evol.fp; 

    public class FileReaderThread extends BaseFilePlugin { 

     public FileReaderThread() { 
      super.setFilename("E:\\soham\\soham.txt"); 
     } 
     @Override 
     public void parseRecord(String record) { 
      System.out.println(record); 
     } 
    } 

Aber es ist nicht das parseRecord Methode des Kindes Aufruf, ein einfaches Hauptmethode: -

package com.evol.fp; 

public class StartProcess { 

public static void main(String[] args) { 
    FileReaderThread thd = new FileReaderThread(); 
    thd.start(); 
} 

} 
+0

wie verwenden Sie/testen? – johnII

+0

Kein Nullzeiger, Datei nicht gefunden –

+0

Ich habe eine Kindklasse, die diese Basisklasse erbt, wenn ich die Datei von der Kindklasse lese, funktioniert es gut, aber wenn ich die Elternmethode benutze, heißt es Datei nicht gefunden –

Antwort

1

Ich denke, es ist, weil die Mutter Konstruktor (BaseFilePlugin.class) aufgerufen wird zuerst, bevor Sie Ihren Dateinamen festgelegt in super.setFile("E:\\soham\\soham.txt");

Wenn Sie den übergeordneten Konstruktor kann stattdessen entfernen und Ihre SetFileName in setFile ersetzen, wo Datei iniatilize .eg ist

// public BaseFilePlugin() { 
//  file = new File(filename); 
// } 
.... 
.... 
/** 
    * @return the file 
    */ 
    public String getFile() { 
     return file 
    } 

    /** 
    * @param file the file to set 
    */ 
    public void setFile(String file) { 
     file = new File(file); 
    } 

und in der Unterklasse

public FileReaderThread() { 
    super.setFile("E:\\soham\\soham.txt"); 
} 
+0

okay, jetzt die Datei existiert, aber selbst wenn es Inhalte seines immer keine –

+0

und wie Sie genau verwendet die Unterklasse hinzufügen? kannst du zeigen wie? und was ist der Inhalt der Datei? – johnII

+0

@johnll, hier ist thye ganze Geschichte –

1

BaseFilePlugin ‚s Konstruktor erstellt seine file mit einem leeren String seit anfangs String filename = "";.

Der Kunde ruft setFilename(...) die filename aktualisiert. file ist jedoch immer noch dieselbe Instanz, als das Objekt zum ersten Mal erstellt wurde (wobei eine leere Zeichenfolge als Dateiname verwendet wird).

Ich würde vorschlagen, die Dateinamen als Teil des Konstruktor übergeben, so wird file richtig initialisiert:

public BaseFilePlugin(String filename) { 
     this.filename = filename; 
     file = new File(filename); 
    } 

Optional ob es Sinn macht, dass eine Instanz nur 1 Datei lesen kann, dann diese Klasse Attribute machen endgültig, und entfernen Sie die setFilename() Methode.

+0

Okay, das half aber irgendwie die parseRecord Methode ist nicht im Innern des Kindes –

+0

Debug und Schritt durch den Code in der Nähe der while-Schleife aufgerufen, um zu sehen, was los ist. –

+0

Debugge, legte einige Drucke, es geht nie zum 'parseRecord' des Kindes –

Verwandte Themen