我正在制作一个适用于MySQL数据库的程序,目前我将URL,登录名和密码等存储为public static String
。现在,我需要使其能够在另一台计算机上工作,因此数据库地址会有所不同,因此我需要一种在programm内进行编辑并保存的方法。我只想使用外部txt文件,但是我不知道如何指出它的位置。
我决定使用属性文件进行制作,将其放置在src/res
文件夹中。当我在Intellij Idea中尝试时,它可以正常工作,但是当我构建jar(工件)时,我得到了java.io.FileNotFoundException
我尝试了两种方法:
这是刚刚复制的
private String getFile(String fileName) {
StringBuilder result = new StringBuilder("");
//Get file from resources folder
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource(fileName).getFile());
System.out.println(file.length());
try (Scanner scanner = new Scanner(file)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
result.append(line).append("\n");
}
scanner.close();
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
System.out.println(obj.getFile("res/cfg.txt"));</code>
And second one using Properties
class:
try(FileReader reader = new FileReader("src/res/cfg.txt")) {
Properties properties = new Properties();
properties.load(reader);
System.out.println(properties.get("password"));
}catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}
StringBuilder result = new StringBuilder("");
//Get file from resources folder
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource(fileName).getFile());
System.out.println(file.length());
try (Scanner scanner = new Scanner(file)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
result.append(line).append("\n");
}
scanner.close();
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
System.out.println(obj.getFile("res/cfg.txt"));</code>
通过两种方式,我得到Properties
。像这样附加配置文件的正确方法是什么?
答案 0 :(得分:3)
由于该文件位于.JAR内,因此无法通过new File()
进行访问,但是您仍然可以通过ClassLoader
进行读取:
Properties properties = new Properties();
try (InputStream stream = getClass().getResourceAsStream("/res/cfg.txt")) {
properties.load(stream);
}
请注意,JAR是只读的。所以这种方法行不通。
如果要具有可编辑的配置,则应将cfg.txt
放在JAR之外,并从文件系统中读取。例如这样的
Properties properties = new Properties();
File appPath = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile();
try (InputStream stream = new FileInputStream(new File(appPath, "cfg.txt"))) {
properties.load(stream);
}
答案 1 :(得分:1)
您可以在多个位置放置配置选项,并且可靠的部署策略将使用以下某些(或全部)技术:
将配置文件存储在相对于用户主文件夹的已知位置,如我在评论中所述。这适用于Windows(C:\Users\efrisch
),Linux(/home/efrisch
)和Mac(/Users/efrisch
)
File f = new File(System.getProperty("user.home"), "my-settings.txt");
读取环境变量以对其进行控制
File f = new File(System.getenv("DEPLOY_DIR"), "my-settings.txt");
使用Apache ZooKeeper之类的分散服务来存储数据库设置
使用Standalone JNDI (或部署目标中内置的JNDI)
答案 2 :(得分:0)
尝试将数据库凭据保存在环境变量中,然后以以下方式调用它们:
public static String myValue = System.getenv("ENVIRONMENT_VARIABLE_NAME");