[英]Reading/Writing to Properties Files inside the jar file
所以我在 4 年后重新开始编写 Java,所以请原谅任何“新手”错误。
我需要一个属性文件,我可以在其中为我的应用程序存储一些简单的数据。 应用程序数据本身不会驻留在此处,但我将存储信息,例如上次使用的数据存储的文件路径、其他设置等。
我设法连接到与试图连接到它的类文件位于同一个包中的属性文件,我可以读取该文件,但我无法写回该文件。 我很确定我的代码可以工作(至少它没有抛出任何错误),但是在 Netbeans 中运行应用程序后,更改并未反映在文件本身中。
在上图中,您可以看到有问题的 mainProperties.properties 文件以及尝试调用它的类 (prefManagement.java)。 所以考虑到这一点,这里是我加载文件的代码:
Properties mainFile = new Properties();
try {
mainFile.load(prefManagement.class.getClass().getResourceAsStream("/numberAdditionUI/mainProperties.properties"));
} catch (IOException a) {
System.out.println("Couldn't find/load file!");
}
这有效,我可以检查并确认一个现有密钥(defaultXMLPath)。
我要添加到此文件的代码是:
String confirmKey = "defaultXMLPath2";
String propKey = mainFile.getProperty(confirmKey);
if (propKey == null) {
// Key is not present so enter the key into the properties file
mainFile.setProperty(confirmKey, "testtest");
try{
FileOutputStream fos = new FileOutputStream("mainProperties.properties");
mainFile.store(fos, "testtest3");
fos.flush();
}catch(FileNotFoundException e ){
System.out.println("Couldn't find/load file3!");
}catch(IOException b){
System.out.println("Couldn't find/load file4!");
}
} else {
// Throw error saying key already exists
System.out.println("Key " + confirmKey + " already exists.");
}
正如我上面提到的,一切运行都没有任何错误,我可以尝试添加现有密钥并抛出预期的错误。 但是当尝试添加新的键/值对时,它不会出现在属性文件的后记中。 为什么?
您不应该尝试写入 jar 文件中存在的“文件”。 实际上,从技术上讲,jar 文件不保存文件,而是保存“资源”,并且出于实际目的,它们是只读的。 如果您需要读取和写入属性文件,它应该在 jar 之外。
您的代码将属性写入本地文件mainProperties.properties
。
运行您的部分代码后,您会发现已在本地创建了一个文件mainProperties.properties
。
FileOutputStream fos = new FileOutputStream("mainProperties.properties");
可以为了不要混淆你指定的本地文件到另一个文件名的两个文件。 例如mainAppProp.properties
。
mainProperties.properties
的完整内容。local
文件mainAppProp.properties
。 FileOutputStream fos = new FileOutputStream("mainAppProp.properties");
将文件是否存在切换到本地文件,如果不存在则创建文件mainAppProp.properties
并将所有属性写入其中。
mainAppProp.properties
是否在本地存在。 在任何情况下,您都不能将这些属性写回到.jar
文件中。
测试一下
[...]
if (propKey == null) {
// Key is not present so enter the key into the properties file
mainFile.setProperty(confirmKey, "testtest");
[...]
Reader reader = null;
try
{
reader = new FileReader( "mainAppProp.properties" );
Properties prop2 = new Properties();
prop2.load( reader );
prop2.list( System.out );
}
catch ( IOException e )
{
e.printStackTrace();
}
finally
{
if (reader != null) {
reader.close();
}
}
}
[...]
}
输出:使用prop2.list( System.out );
-- 列出属性 --
defaultXMLPath2=testtest
文件mainAppProp.properties
内容
#testtest3
#Mon Jul 14 14:33:20 BRT 2014
defaultXMLPath2=testtest
挑战:读取 jar 文件中的属性文件位置 读取属性文件 将变量写入系统变量
public static void loadJarCongFile(Class Utilclass )
{
try{
String path= Utilclass.getResource("").getPath();
path=path.substring(6,path.length()-1);
path=path.split("!")[0];
System.out.println(path);
JarFile jarFile = new JarFile(path);
final Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
final JarEntry entry = entries.nextElement();
if (entry.getName().contains(".properties")) {
System.out.println("Jar File Property File: " + entry.getName());
JarEntry fileEntry = jarFile.getJarEntry(entry.getName());
InputStream input = jarFile.getInputStream(fileEntry);
setSystemvariable(input);
InputStreamReader isr = new InputStreamReader(input);
BufferedReader reader = new BufferedReader(isr);
String line;
while ((line = reader.readLine()) != null) {
System.out.println("Jar file"+line);
}
reader.close();
}
}
}
catch (Exception e)
{
System.out.println("Jar file reading Error");
}
}
public static void setSystemvariable(InputStream input)
{
Properties tmp1 = new Properties();
try {
tmp1.load(input);
for (Object element : tmp1.keySet()) {
System.setProperty(element.toString().trim(),
tmp1.getProperty(element.toString().trim()).trim());
}
} catch (IOException e) {
System.out.println("setSystemvariable method failure");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.