我想要做的是从一个文件(使用 Apache poi 的 excel 文件)加载键/值对到一个将用作查找表的静态映射中。一旦加载,表格将不会改变。
public final class LookupTable
{
private final static Map<String, String> map;
static {
map = new HashMap<String, String>();
// should do initialization here
// InputStream is = new FileInputStream(new File("pathToFile"));
// not sure how to pass pathToFile without hardcoding it?
}
private LookupTable() {
}
public static void loadTable(InputStream is) {
// read table from file
// load it into map
map.put("regex", "value");
}
public static String getValue(String key) {
return map.get(key);
}
}
理想情况下,我想在静态初始化 block 中加载 map ,但我如何在不硬编码的情况下传递流?我在使用 loadTable 静态方法时遇到的问题是它可能不会在调用其他静态方法之前被调用。
// LookupTable.loadTable(stream);
LookupTable.getValue("regex"); // null since map was never populated.
有更好的方法吗?
最佳答案
您使用的任何东西都必须在启动时可以访问。据我所知,您的选择是:
- 对路径进行硬编码。由于显而易见的原因,这很糟糕。
- 静态变量或静态方法。这有点像先有鸡还是先有蛋的问题;最终它会被硬编码,但至少您可以使用
static
方法进行搜索。 - 使用 Java 或环境变量。因此,您将使用
System.getProperty("filename", "/default/filename")
。更好,因为它至少可以在 JVM 启动时使用环境或-D
参数进行自定义。 - 使用
ClassLoader
getResource*
方法。这可能是正确的答案。具体来说,您可能希望使用getResourceAsStream()
当前线程上下文ClassLoader
上的方法Thread.currentThread().getContextClassLoader()
. (因此,Thread.currentThread().getContextClassLoader().getResourceAsStream("filename")
总共。)ClassLoader
将为您找到您的资源(只要你把它放在你的CLASSPATH
中的某个理智的地方)。
关于java - 如何将参数传递给静态初始化 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791259/