我想通过servlet从configures.properties
设置数据。 configures.properties
位于WEB-INF/classes
。这就是我获取数据的方式:
public static String getDbPassword() {
Properties prop = new Properties();
try {
// load a properties file
InputStream in = Configures.class.getResourceAsStream(INPUT_FILE);
prop.load(in);
// get the property value
return prop.getProperty("dbPassword");
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
但如何设定?这就是我的方式:
public static void setDbPassword(String str) {
Properties prop = new Properties();
try {
//load a properties file
InputStream in = Configures.class.getResourceAsStream(INPUT_FILE);
prop.load(in);
prop.setProperty("dbPassword", str);
prop.store(new FileOutputStream(INPUT_FILE), null);
} catch (IOException ex) {
ex.printStackTrace();
}
}
但在此之后我抓住了java.io.FileNotFoundException
。我认为它发生在prop.store(new FileOutputStream(INPUT_FILE), null);
之后。我该如何修改OutputStream
?
UPD:
这就是INPUT_FILE
的样子:
private static final String INPUT_FILE = "/config.properties";
答案 0 :(得分:1)
URL url = Configures.class.getResource(INPUT_FILE);
File file = new File(url.toURI());
OutputStream outputStream = new FileOutputStream(file);
...
prop.store(outputStream, null);
答案 1 :(得分:1)
尝试使用FileWriter:
Writer writer = new FileWriter(INPUT_FILE);
...
prop.store(writer, null);
答案 2 :(得分:1)
您可以尝试以下方法:
阅读文件时
URL url = classLoader.getResource(INPUT_FILE);
InputStream in = url.openStream();
写作时:
new FileOutputStream(url.toURI().getPath())
答案 3 :(得分:1)
您的网络应用中的任何文件都应被视为只读。如果您想要可变数据,则应使用数据库或其他数据存储。
J2EE建议不要操纵本地文件,因为它会引发集群,事务和安全等问题。
答案 4 :(得分:1)
您的INPUT_FILE
是getResourceAsStream
将相对于类路径解析的资源路径,但您尝试将相同的字符串传递给FileOutputStream
构造函数,该构造函数将尝试和处理它作为相对于文件系统根的绝对路径。这是两个不同的位置。
您可以使用ServletContext.getRealPath("WEB-INF/classes" + INPUT_FILE)
获取FileOutputStream
所需的路径。
但是,更高级别的问题是,您不应该假设您的Web应用程序将具有对其WEB-INF
的写入权限,或者甚至该目录存在于磁盘上(例如,如果应用程序直接运行)从WAR而不是在磁盘上解压缩的目录)。如果要存储可以更改的配置数据,那么它应该放在Web应用程序的外部的已知位置的文件中(此文件的位置可能是init参数),您知道您将拥有该文件读写权限。当您部署新版本的应用程序时,这也会阻止您的更改被覆盖。