更好的方法指向属性文件中的文件夹和文件?

时间:2012-12-15 14:56:55

标签: java design-patterns properties

我想知道是否有更好的方法在属性文件中指向PATH。请考虑以下代码:

public class Properties
{ 
     //MIKE
     public final static String PATH_TO_FILE_A = "C:\\programmer_MIKE\fileA.txt";
     public final static String PATH_TO_FILE_B = "C:\\programmer_MIKE\fileB.txt";

     //BILL
     //public final static String PATH_TO_FILE_A = "/Users/BILL/Desktop/fileA.txt";
     //public final static String PATH_TO_FILE_B = "/Users/BILL/Desktop/fileB.txt";
}

当任何开发人员需要调用FILE_A时,他只需执行:

File file = new File(Properties.PATH_TO_FILE_A);
如果BILL注释掉了MIKE的PATH_TO_FILE_A,这对BILL来说还可以。

问:有更好的设计吗?如果BILL承诺他的工作包括属性文件 - 他将给MIKE带来问题(不用担心,他以后会得到一杯咖啡拿铁)。

  • FILES很大(2-4Gb),我们不想把它们放在我们的存储库(svn)中,有时只有临时文件夹来创建PDF所以我们不想把它们放在一个“ ./docs“路径。

感谢任何指针!

3 个答案:

答案 0 :(得分:2)

如果出于某种原因你必须拥有硬编码路径,那么你可以将它们存储在某种由用户名索引的地图中。类似的东西:

public class Properties {

    private static Map<String, DeveloperPaths> properties = create();

    private static Map<String, DeveloperPaths> create() {

        Map<String, DeveloperPaths> properties = new HashMap<String, DeveloperPaths>();

        properties.put("mike", new DeveloperPaths(
                "C:\\programmer_MIKE\fileA.txt", 
                "C:\\programmer_MIKE\fileB.txt")
                );

        properties.put("bill", new DeveloperPaths(
                "/Users/BILL/Desktop/fileA.txt", 
                "/Users/BILL/Desktop/fileB.txt")
                );

        return properties;
    }

    public static File FileA()
    {
        String user = System.getProperty("user.name");
        return properties.get(user).fileA;
    }

    public static File FileB()
    {
        String user = System.getProperty("user.name");
        return properties.get(user).fileB;
    }

}

 class DeveloperPaths {
    public File fileA;
    public File fileB;

    public DeveloperPaths(String pathA, String pathB) {
        fileA = new File(pathA);
        fileB = new File(pathB);
    }
}

然后,无论开发人员如何,访问每个路径的代码都是相同的,例如:

File myFile = Properties.fileA();

答案 1 :(得分:1)

通常路径是可配置的,应该存储在属性文件中。

属性文件在java中具有内置支持,它使用Properties对象来存储该信息。

您可以在应用程序的启动或init(或类似)方法中读取属性文件,并从属性文件中读取proeprties。这将使您的配置动态化,任何人都可以更改它。

您可以创建静态方法并在启动时调用它,如:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


public class GetProperties {
    public static Properties prop = new Properties();

    public static void init() {

        InputStream inputStream = GetProperties.class.getClassLoader().getResourceAsStream("application.properties");
        try {
            prop.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
}

答案 2 :(得分:0)

这样的事情应该在外部配置和/或通过参数,系统参数或环境变量传递。或者你可以使用DI / IoC,但是当没有附加行为时,IMO配置值就足够了。

没有硬编码的默认值,但是其他类似的东西不属于代码。