2012-03-12 32 views
6

构造函数的第一行我使用的是CSVReader类,需要一个本地文件作为输入。但现在,我需要能够读取本地文件以及文件有一个URL路径(如http://example.com/example.txt)。要做到这一点,我想获得从CSVReader一类标识文件是否是本地或URL,然后使用超()在构造函数中的第一行传递的InputStream父。这样做的优雅方式是什么?办法当超级不能在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

请不要将您的类与同名的类叫做i在JDK中。你会导致某人非常困惑,很可能是你自己。 – EJP 2012-03-13 01:44:02

回答

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'方法必须声明为'static'。 – 2012-03-12 22:14:14

+0

它是静态的,但名称是错误的。我会解决的。 – 2012-03-12 22:15:18

+0

我在编辑之前添加了评论,sry。 – 2012-03-12 22:16:37

2

移动代码计算参数super()静态函数,并调用它里面super()

7

你可以声明构造函数作为private,并创建一个工厂静态方法,它会调用构造函数之前做检查。

0

您可以重构代码,以包括将创造一切必要的东西,然后调用静态方法构造函数:

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