所以我在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.");
}
正如我上面提到的,一切都运行没有任何错误,我可以尝试添加现有的密钥,它会引发预期的错误。但是当尝试添加新的键/值对时,它不会显示在属性文件中。为什么?
答案 0 :(得分:3)
您不应该尝试写入"文件"存在于jar文件中。实际上,从技术上讲,jar文件不会保存文件,而是保存资源"并且出于实际目的,它们是只读的。如果您需要读取和写入属性文件,它应该在jar之外。
答案 1 :(得分:2)
您的代码会将属性写入本地文件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
答案 2 :(得分:1)
挑战: 读取jar文件中的Property文件位置 阅读Property文件 将变量写为系统变量
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");
}
}