Java 是否有方法从项目外部的属性文件加载信息';项目作为JAR导出时的目录?
我需要将数据库凭据保存在位于项目文件夹/结构/类路径(即C:/Parent\u name/config/config.properties)之外的属性文件中。项目(C:/Parent\u name/Tomcat/project\u name/)作为JAR导出,并用于其他应用程序(C:/Tomcat/webapps/app\u 1/WEB-INF/lib/project\u name.JAR),然后部署到Tomcat服务器 我发现我无法执行简单的FileInputStream,因为该文件需要是类路径的一部分,并且我需要该文件位于项目之外,以便DBA可以在需要时轻松更新凭据。getResourceAsSteam()返回空指针异常 下面是两个无法实现我需要的代码示例: 文件输入蒸汽Java 是否有方法从项目外部的属性文件加载信息';项目作为JAR导出时的目录?,java,Java,我需要将数据库凭据保存在位于项目文件夹/结构/类路径(即C:/Parent\u name/config/config.properties)之外的属性文件中。项目(C:/Parent\u name/Tomcat/project\u name/)作为JAR导出,并用于其他应用程序(C:/Tomcat/webapps/app\u 1/WEB-INF/lib/project\u name.JAR),然后部署到Tomcat服务器 我发现我无法执行简单的FileInputStream,因为该文件需要是类路
private static Object readConfigFile() {
try (InputStream input = new FileInputStream("C:\\Parent_name\\config\\config.properties")) {
Properties prop = new Properties();
// load a properties file
prop.load(input);
// get the property value and print it out
System.out.println(prop.getProperty("db.url"));
System.out.println(prop.getProperty("db.user"));
System.out.println(prop.getProperty("db.password"));
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
getresrouceasteam()
是的,有一种方法可以“当项目作为JAR导出时,有没有方法从项目目录之外的属性文件加载信息?”
听起来你好像不想使用资源。实际上,您可能会使用普通文件。也许在用户文件夹中检查一个文件,如果它不存在,创建一个他们可以填充的文件。我不确定为什么你认为你不能使用一个普通的
FileInputStream
,这就是他们的目的——文件输入流,在文档中这样说:“从文件系统中的文件获取输入字节”。您现在拥有的资源必须位于项目类路径中。您的第一个示例不是一个FileInputStream
,而是一个资源流。“我不能做一个简单的FileInputStream,因为该文件需要是类路径的一部分”事实上,情况正好相反。资源必须位于类路径或模块路径中;FileInputStream实际上是用来读取文件系统上的任何(可读)文件的;文件路径是文件路径:如果文件存在并且用户有权访问它,它应该可以正常工作。如果没有,那么其他的东西就错了。Java代码是否在.jar文件中运行与读取文件系统中常规文件的能力无关。考虑使用而不是FielePixSt流,因为前者将给您提供更具信息性的异常,例如,如果文件存在,但您的程序没有读取它的权限。当您正在进行涉及文件的编程时,提出文件浏览器(Windows + E)是一个好主意,然后转到查看、选项,然后选择“查看”选项卡,取消选中“隐藏已知文件类型的扩展名”。这将防止Windows诱使您相信某个文件的名称与其实际名称不同。程序员需要知道真实的文件名,而不是“美化”的名称。
private static Object readConfigFile() {
try {
Class cls = Class.forName("SQLCredentials");
// returns the ClassLoader object associated with this Class
ClassLoader cLoader = cls.getClassLoader();
InputStream input = cLoader.getResourceAsStream("C:/Parent_name/config/config.properties");
Properties prop = new Properties();
// load a properties file
prop.load(input);
// get the property value and print it out
System.out.println(prop.getProperty("db.url"));
System.out.println(prop.getProperty("db.user"));
System.out.println(prop.getProperty("db.password"));
} catch (IOException | ClassNotFoundException ex) {
ex.printStackTrace();
}
return null;
}
String[] pathnames;
// Creates a new File instance by converting the given pathname string
// into an abstract pathname
File f = new File("C:\\Parent_name\\config");
// Populates the array with names of files and directories
pathnames = f.list();
// For each pathname in the pathnames array
for (String pathname : pathnames) {
// Print the names of files and directories
System.out.println(pathname);
}
private static Object readConfigFile() {
try (InputStream input = Files.newInputStream(Paths.get("C:\\Parent_name\\config\\config.properties"))) {
Properties prop = new Properties();
// load a properties file
prop.load(input);
// get the property value and print it out
System.out.println(prop.getProperty("dev.url"));
System.out.println(prop.getProperty("dev.user"));
System.out.println(prop.getProperty("dev.password"));
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}