繁体   English   中英

读取/写入 jar 文件中的属性文件

[英]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是否在本地存在。
  • 将属性读入新的“probs”变量。
  • 从现在开始只使用这个文件。

在任何情况下,您都不能将这些属性写回到.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM