2012-03-12 10 views
6

Sto utilizzando una classe CSVReader che accetta un file locale come input. Ma ora, ho bisogno di essere in grado di leggere i file locali così come i file con un percorso URL (come http://example.com/example.txt). Per fare questo, voglio ottenere una classe da CSVReader che identifichi se il file è locale o URL, e quindi passare InputStream al genitore usando super() nella prima riga del costruttore. Qual è il modo elegante di farlo?Soluzione quando super non può essere la prima riga del costruttore in java

public class FileReader extends CsvReader{ 
    public FileReader(){ 
     if (fileName != null) { 

       if (fileName.trim().startsWith("http:")) { 
       // it is URL 
       URL url = new URL(fileName); 
       inputStream = new BufferedReader(new InputStreamReader(
         url.openStream(), charset), 
         StaticSettings.MAX_FILE_BUFFER_SIZE); 
       }else{ 
       //it is a local file 
       inputStream = new BufferedReader(new InputStreamReader(
         new FileInputStream(fileName), charset), 
         StaticSettings.MAX_FILE_BUFFER_SIZE); 
       } 

      } 
      //Now pass the input stream to CsvReader 
      super(inputStream, delimiter, charset); //error - super has to be first line of constructor 
    } 
} 
+0

Si prega di non chiamare le classi lo stesso nome di classi ben noti i n il JDK. Stai per causare a qualcuno una grande confusione, molto probabilmente te stesso. – EJP

risposta

11

È possibile scrivere i metodi ausiliari:

super(createReader(createInputStream(resouce), "UTF-8"), ";"); 

Il tuo metodo ausiliario potrebbe essere simile a questo:

public static InputStream createInputStream(String resource) 
{ 
    resource = resource.trim(); 

    if (resource.startsWith("http:")) 
    { 
      return new URL(resource).openStream(); 
    } else 
    { 
      return new FileInputStream(new File(resource)); 
    } 
} 

public static BufferedReader createReader(InputStream is, String charset) 
{ 
    return new BufferedReader(new InputStreamReader(is, charset)); 
} 
+0

Il metodo 'constructInputStream' deve essere dichiarato' static'. –

+0

È statico, tranne che il nome è sbagliato. Sistemerò –

+0

Ho aggiunto il commento prima della modifica, sry. –

2

Spostare il codice per calcolare gli argomenti super() a una funzione statica, e chiamano all'interno super().

7

È possibile dichiarare il costruttore come private e creare un metodo statico di fabbrica, che eseguirà il controllo prima di richiamare il costruttore.

0

È possibile refactoring del codice per includere metodo statico che creerà tutte le cose necessarie e quindi chiamare il costruttore:

public class FileReader extends CsvReader 
{ 
    public static FileReader createFileReader(String filename, String delimiter, String charset){ 
     if (fileName != null) { 
      BufferedReader inputStream; 
      if (fileName.trim().startsWith("http:")) { 
       // it is URL 
       URL url = new URL(fileName); 
       inputStream = new BufferedReader(new InputStreamReader(url.openStream(), charset), StaticSettings.MAX_FILE_BUFFER_SIZE); 
      } 
      else 
      { 
       //it is a local file 
       inputStream = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), charset), StaticSettings.MAX_FILE_BUFFER_SIZE); 
      } 
      return new FileReader(inputStream, delimiter, charset); 
     } 
     return null; 
    } 

    public FileReader(BufferedReader inputStream, String delimiter, String charset){ 
      super(inputStream, delimiter, charset); 
    } 
} 
Problemi correlati