4

我有一个需要在 Windows 和 Linux 上运行的 java swing 数据库应用程序。我的数据库连接详细信息存储在一个 XML 文件中,我会加载它们。

此应用程序可以在 Linux 上正确加载此属性,但不能在 Windows 上运行。

如何使用 Java 在多个平台上正确加载文件?


这是代码:

PropertyHandler propertyWriter = new PropertyHandler();

List keys = new ArrayList();
keys.add("ip");
keys.add("database");
Map localProps = propertyWriter.read(keys, "conf" + File.separatorChar + "properties.xml", true);//if false load from the local properties

//get properties from the xml in the internal package
List seKeys = new ArrayList();
seKeys.add("driver");
seKeys.add("username");
seKeys.add("password");

Map seProps = propertyWriter.read(seKeys, "conf" + File.separatorChar + "properties.xml", true);

String dsn = "jdbc:mysql://" + (String) localProps.get("ip") + ":3306/" + (String) localProps.get("database");
jDBCConnectionPool = new JDBCConnectionPool((String) seProps.get("driver"), dsn, (String) seProps.get("username"), (String) seProps.get("password"));

文件阅读器方法:

public Map read(List properties, String path, boolean isConfFromClassPath)
{
    Properties prop = new Properties();
    Map props = new HashMap();
    try {

        if (isConfFromClassPath) {
            InputStream in = this.getClass().getClassLoader().getResourceAsStream(path);
            prop.loadFromXML(in);

            for (Iterator i = properties.iterator(); i.hasNext();) {
                String key = (String) i.next();
                props.put(key, prop.getProperty(key));
            }
            in.close();

        } else {
            FileInputStream in = new FileInputStream(path);
            prop.loadFromXML(in);

            for (Iterator i = properties.iterator(); i.hasNext();) {
                String key = (String) i.next();
                props.put(key, prop.getProperty(key));
            }
            in.close();
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return props;
}
4

5 回答 5

5

如果文件在 jar 文件中并由类路径访问,那么您应该始终使用/.

JavaDocsClassLoader.getResource说“资源的名称是一个 '/' 分隔的路径名,用于标识资源。”

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String )

于 2012-05-15T05:06:17.850 回答
1

我不确定是否有正确的方法,但一种方法是:

File confDir = new File("conf");
File propFile = new File(confDir, "properties.xml");

但是在像你这样简单的场景中,我会使用/

于 2012-05-15T05:07:32.647 回答
0

如果它是位于类路径中的资源,我们可以使用以下代码段加载它:

getClass().getClassLoader().getResourceAsStream(
    "/META-INF/SqlQueryFile.sql")));
于 2012-05-15T05:05:30.260 回答
0

您可以毫无问题地在多个平台上加载所有文件。

请使用 Matcher.quoteReplacement(File.separator) 替换斜线。

它适用于每个平台。

String fileLocation = "/src/service/files";

fileLocation  = fileLocation.replaceAll("/",Matcher.quoteReplacement(File.separator));
于 2018-03-13T17:59:38.503 回答
-1

假设您的文件在 Linux 上的 conf/properties.xml 和 Windows 上的 conf\properties.xml 中,请使用 File.pathSeparator 而不是 File.separator

于 2012-05-15T04:58:10.897 回答