通过Servlet进行属性设置

时间:2014-03-10 09:47:44

标签: java file servlets properties

我想通过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";

5 个答案:

答案 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_FILEgetResourceAsStream将相对于类路径解析的资源路径,但您尝试将相同的字符串传递给FileOutputStream构造函数,该构造函数将尝试和处理它作为相对于文件系统根的绝对路径。这是两个不同的位置。

您可以使用ServletContext.getRealPath("WEB-INF/classes" + INPUT_FILE)获取FileOutputStream所需的路径。

但是,更高级别的问题是,您不应该假设您的Web应用程序将具有对其WEB-INF的写入权限,或者甚至该目录存在于磁盘上(例如,如果应用程序直接运行)从WAR而不是在磁盘上解压缩的目录)。如果要存储可以更改的配置数据,那么它应该放在Web应用程序的外部的已知位置的文件中(此文件的位置可能是init参数),您知道您将拥有该文件读写权限。当您部署新版本的应用程序时,这也会阻止您的更改被覆盖。