2017-12-22 29 views
0

他のスレッドが継承するベースファイルのプラグインを作成しようとしています。しかし、ファイルが存在し、通常のスレッドから読み込むことができますが、抽象ベースファイルからそのファイルを読み込もうとすると、File not foundと表示されます。ここに私の基本クラスです: - 私はマルチスレッドを意識誰かが素晴らしいものになる問題だものを私に伝えている場合、ファイルからレコードを解析するために、基本クラスで実装されたことがないよ抽象クラスからファイルを読み込めません

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; 
     } 

    } 

。私はファイルが確実に存在することを知っています。

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); 
     } 
    } 

しかし、そのは、簡単なmainメソッド使用して、子供のparseRecordメソッドを呼び出していない: - - :ここに私の子クラスです親のコンストラクタ(BaseFilePlugin.class)が呼び出されるため

package com.evol.fp; 

public class StartProcess { 

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

} 
+0

どのように使用/テストしますか? – johnII

+0

nullポインタがありません。ファイルが見つかりません。 –

+0

子クラスから継承した子クラスがあります。子クラスからファイルを読み込んだときに正常に動作しますが、親メソッドを使用するとファイルが見つかりません。 –

答えて

1

私はそれがだと思うが最初にあなたがsuper.setFile("E:\\soham\\soham.txt");

であなたのファイル名を設定する前に、あなたは代わりに親のコンストラクタを削除することができた場合は、ファイルがiniatilize .eg

01ですsetFileにあなたのsetFileNameを置き換えます
// 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); 
    } 

とあなたのサブクラスで

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

ファイルが存在しますが、内容がなくても –

+0

が得られ、サブクラスはどのように使用しますか?あなたはどのように表示できますか?ファイルの内容は何ですか? – johnII

+0

@johnll、ここには全編があります –

1

BaseFilePluginのコンストラクタは、最初はString filename = "";以来、空の文字列とそのfileを作成します。

クライアントはsetFilename(...)を呼び出し、filenameを更新します。ただし、fileは、オブジェクトが最初に作成されたとき(ファイル名として空の文字列を使用している)と同じインスタンスです。

私はそうfileが正しく初期化されたコンストラクタの一部としてファイル名を渡すことをお勧め:

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

必要に応じて、それは理にかなっている場合、インスタンスは1つだけのファイルを読むことができること、そしてこれらのクラス属性を作ります最後にsetFilename()メソッドを削除します。

+0

これは役に立ちましたが、なんとかparseRecordメソッドが子の内部で呼び出されませんでした。 –

+0

デバッグし、何が起こっているかを見るためにwhileループの近くのコードをステップ実行します。 –

+0

デバッグして、いくつかのプリントを置いてください。決して子供の 'parseRecord'には行きません。 –

関連する問題