对于我正在处理的应用程序中的双语支持,我们使用spring消息传递,它使用两个文件applicationresources.properties和applicationresources\u fr.properties。这很有效。
现在我试图通过使它更具活力来扩展它。应用程序将从数据库中读取键值对并插入它们,这将导致以下错误:
java.io.FileNotFoundException: \ApplicationResources.properties (Access is denied)
我能够检查键值对,这样我就知道我使用的路径是正确的。我还通过右键单击和访问系统上的实际文件检查了eclipse属性中的文件,它们不是只读的。我不相信他们是加密的,因为我可以打开和查看记事本++。
这是我的测试代码,显示我可以查看它们
Properties test_prop = null;
InputStream is = null;
try {
test_prop = new Properties();
is = this.getClass().getResourceAsStream(en_path);
test_prop.load(is);
Set<Object> keys = test_prop.keySet();
boolean key_found = false;
for(Object k:keys) {
String key = (String)k;
if(key.equals("f12345"))
{
key_found=true;
break;
}
}
System.out.println("Language Properties Test in DAO:" + (key_found? "Key Found" : "Key not found"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
下面是我尝试写入文件并得到错误的地方:
ResultSet rs = null;
try (
Connection connection = jdbcTemplate.getDataSource().getConnection();
CallableStatement callableStatement = connection.prepareCall(test_prod_cur);
)
{
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
callableStatement.executeUpdate();
rs = (ResultSet) callableStatement.getObject(1);
while (rs.next())
{
String thead = rs.getString(1);
//System.out.println(thead + " " + rs.getString(2) + " " + rs.getString(3));
en_prop.setProperty(keyheader+thead, rs.getString(2));
fr_prop.setProperty(keyheader+thead, rs.getString(3));
}
}
catch (SQLException e)
{
System.out.println("SQLException - bilingual values - CLUDAOImpl");
System.out.println(e.getMessage());
}
//add to properties files
//*
try (OutputStream en_os = new FileOutputStream(en_path);)
{
en_prop.store(en_os, null);
} catch (IOException e) {
e.printStackTrace();
}
try(OutputStream fr_os = new FileOutputStream(en_path);)
{
fr_prop.store(fr_os, null);
} catch (IOException e) {
e.printStackTrace();
}
所以数据库查询是成功的,这是用注解掉的system.out.println测试的。以下几行最终抛出错误:
en_prop.store(en_os, null);
fr_prop.store(fr_os, null);
更新:我在java.util.properties上做了一个搜索,找到了它上面的javadocs,wow简化了很多事情。我现在可以获取一个属性值或检查键是否存在于6行代码中(不包括try-catch)。
Properties prop = null;
InputStream is = null;
this.prop = new Properties();
is = this.getClass().getResourceAsStream(path);
prop.load(is);
this.prop.getProperty("key name"); //returns value of key, or null
this.prop.containsKey("key name"); //returns true if key exists
update2:使用java.util.properties时存在一个问题,即您丢失了原始文件的所有格式,因此空格、注解和顺序都丢失了。在另一个答案中,有人建议使用apache的commons配置api。我打算试一试。
1条答案
按热度按时间pobjuy321#
因此,我最终创建了一个类来处理与applicationresources(\u fr).properties文件的交互,而不是在dao中进行。这是因为我计划在更多的地方使用它。我还开始使用java.util.properties javadocs中的方法,这些方法非常有用,简化了许多领域。
下面是我的新文件写入/属性存储代码。
让我们比较新的和原始的输出流:
这个答案是不完整的,原因如下。
我无法解释为什么原始方法失败并导致“拒绝访问错误”。
更重要的是,这实际上并没有改变我期望或想要的文件。我希望修改出现在我的项目导航器中的文件,但是在查看时没有看到更改。如果我使用一个绝对路径(c:\…)并覆盖文件,那么我可以按预期更改它,但是这个路径必须随着服务器的更改而更改,它的糟糕编程和危险。此工作方法是更改某种临时文件或正在运行的文件(通过路径确认,显示新值的文件位于tmp0文件夹中)。在一些测试之后,只有当原始文件被更改时,这个临时文件才会在启动时被覆盖,否则新的值会在应用程序启动时保持不变。
我也不确定这个文件的范围。我无法判断是否所有与网站交互的用户都会对同一个文件进行更改。如果所有用户都在与文件交互,则可能会发生跨会话的潜在泄漏。也有可能每个会话都有独立的值,从而导致信息丢失。我怀疑所有用户都在与同一个资源交互,但没有执行对此绝对肯定的测试。更新:我已经确认所有用户都与同一个临时文件交互。