2012-03-12 41 views
6

में कन्स्ट्रक्टर की पहली पंक्ति नहीं हो सकता है, तो मैं एक CSVReader क्लास का उपयोग कर रहा हूं जो स्थानीय फ़ाइल को इनपुट के रूप में लेता है। लेकिन अब, मुझे स्थानीय फाइलों के साथ-साथ यूआरएल पथ वाली फाइलें पढ़ने में सक्षम होना चाहिए (जैसे http://example.com/example.txt)। ऐसा करने के लिए, मैं CSVReader से एक क्लास प्राप्त करना चाहता हूं जो यह पहचानता है कि फ़ाइल स्थानीय या यूआरएल है या फिर कन्स्ट्रक्टर की पहली पंक्ति में सुपर() का उपयोग करके माता-पिता को इनपुटस्ट्रीम पास करें। ऐसा करने का सुरुचिपूर्ण तरीका क्या है?समाधान जब जावा जावा

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

कृपया अपने वर्गों को समान नामों के साथ-साथ जाने-माने वर्गों को भी न कहें। एन जेडीके। आप किसी को भी बहुत भ्रम पैदा करने जा रहे हैं, बहुत संभवतः खुद। – EJP

उत्तर

11

आप सहायक तरीकों लिख सकते हैं:

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

आपका सहायक विधि इस प्रकार दिखाई देंगे:

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

विधि 'constructInputStream' विधि' स्थिर 'घोषित की जानी चाहिए। –

+0

यह स्थिर है, सिवाय इसके कि नाम गलत है। मेरे द्वारा ठीक कर दिया जाएगा। –

+0

मैंने संपादन से पहले टिप्पणी जोड़ा, श्रीमान। –

2

एक स्थिर कार्य करने के लिए super() तर्क गणना करने के लिए कोड को इस प्रकार है, और यह super() अंदर कहते हैं।

7

आप अपने निर्माता को private के रूप में घोषित कर सकते हैं, और एक फैक्ट्री स्थैतिक विधि बना सकते हैं, जो कि कन्स्ट्रक्टर को आमंत्रित करने से पहले जांच करेगा।

0

आप अपने कोड refactor स्थिर विधि है कि सभी आवश्यक सामान बनाने और उसके बाद फोन करेगा शामिल करने के लिए कर सकते हैं कन्स्ट्रक्टर:

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); 
    } 
} 
संबंधित मुद्दे