Frage

Ich schreibe einen Drop-in-Ersatz für eine Legacy-Anwendung in Java. Eine der Voraussetzungen ist, dass die INI-Dateien, die die ältere verwendete Anwendung gelesen werden müssen in die neue Java-Anwendung, wie sie ist. Das Format dieser INI-Dateien ist der gemeinsame Windows-Stil, mit Kopfabschnitten und Schlüssel-Wert-Paaren, mit # als Zeichen für die Kommentare.

Ich habe versucht, die Eigenschaften Klasse von Java verwenden, aber das ist natürlich nicht funktionieren, wenn es Namenskonflikte zwischen den verschiedenen Header ist.

Die Frage ist also, was der einfachste Weg wäre in dieser INI-Datei zu lesen und die Schlüssel zugreifen?

War es hilfreich?

Lösung

Die Bibliothek, die ich verwendet habe, ist ini4j . Es ist leicht und analysiert die INI-Dateien mit Leichtigkeit. Auch verwendet er keine esoterischen Abhängigkeiten zu 10.000 anderen JAR-Dateien, als eines der Entwicklungsziele war nur die Standard-Java-API zu verwenden,

Dies ist ein Beispiel dafür, wie die Bibliothek verwendet wird:

Ini ini = new Ini(new File(filename));
java.util.prefs.Preferences prefs = new IniPreferences(ini);
System.out.println("grumpy/homePage: " + prefs.node("grumpy").get("homePage", null));

Andere Tipps

Wie erwähnt , ini4j dies zu erreichen, verwendet werden kann. Lassen Sie mich ein anderes Beispiel zeigen.

Wenn wir eine INI-Datei wie folgt aus:

[header]
key = value

Im Folgenden soll value auf STDOUT angezeigt werden:

Ini ini = new Ini(new File("/path/to/file"));
System.out.println(ini.get("header", "key"));

Überprüfen Sie die Tutorials für weitere Beispiele.

So einfach wie 80 Zeilen:

package windows.prefs;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IniFile {

   private Pattern  _section  = Pattern.compile( "\\s*\\[([^]]*)\\]\\s*" );
   private Pattern  _keyValue = Pattern.compile( "\\s*([^=]*)=(.*)" );
   private Map< String,
      Map< String,
         String >>  _entries  = new HashMap<>();

   public IniFile( String path ) throws IOException {
      load( path );
   }

   public void load( String path ) throws IOException {
      try( BufferedReader br = new BufferedReader( new FileReader( path ))) {
         String line;
         String section = null;
         while(( line = br.readLine()) != null ) {
            Matcher m = _section.matcher( line );
            if( m.matches()) {
               section = m.group( 1 ).trim();
            }
            else if( section != null ) {
               m = _keyValue.matcher( line );
               if( m.matches()) {
                  String key   = m.group( 1 ).trim();
                  String value = m.group( 2 ).trim();
                  Map< String, String > kv = _entries.get( section );
                  if( kv == null ) {
                     _entries.put( section, kv = new HashMap<>());   
                  }
                  kv.put( key, value );
               }
            }
         }
      }
   }

   public String getString( String section, String key, String defaultvalue ) {
      Map< String, String > kv = _entries.get( section );
      if( kv == null ) {
         return defaultvalue;
      }
      return kv.get( key );
   }

   public int getInt( String section, String key, int defaultvalue ) {
      Map< String, String > kv = _entries.get( section );
      if( kv == null ) {
         return defaultvalue;
      }
      return Integer.parseInt( kv.get( key ));
   }

   public float getFloat( String section, String key, float defaultvalue ) {
      Map< String, String > kv = _entries.get( section );
      if( kv == null ) {
         return defaultvalue;
      }
      return Float.parseFloat( kv.get( key ));
   }

   public double getDouble( String section, String key, double defaultvalue ) {
      Map< String, String > kv = _entries.get( section );
      if( kv == null ) {
         return defaultvalue;
      }
      return Double.parseDouble( kv.get( key ));
   }
}

Hier ist ein einfaches, aber leistungsstarkes Beispiel mit der Apache-Klasse HierarchicalINIConfiguration :

HierarchicalINIConfiguration iniConfObj = new HierarchicalINIConfiguration(iniFile); 

// Get Section names in ini file     
Set setOfSections = iniConfObj.getSections();
Iterator sectionNames = setOfSections.iterator();

while(sectionNames.hasNext()){

 String sectionName = sectionNames.next().toString();

 SubnodeConfiguration sObj = iniObj.getSection(sectionName);
 Iterator it1 =   sObj.getKeys();

    while (it1.hasNext()) {
    // Get element
    Object key = it1.next();
    System.out.print("Key " + key.toString() +  " Value " +  
                     sObj.getString(key.toString()) + "\n");
}

Commons-Konfiguration hat eine Reihe von Laufzeitabhängigkeiten . Zumindest commons-lang und commons-logging erforderlich. Je nachdem, was Sie mit ihm tun, können Sie zusätzliche Bibliotheken benötigen (vorherigen Link für Details).

oder mit Standard-Java-API können Sie java .util.Properties :

Properties props = new Properties();
try (FileInputStream in = new FileInputStream(path)) {
    props.load(in);
}

18 Zeilen, die java.util.Properties der sich in mehrere Abschnitte zu analysieren:

public static Map<String, Properties> parseINI(Reader reader) throws IOException {
    Map<String, Properties> result = new HashMap();
    new Properties() {

        private Properties section;

        @Override
        public Object put(Object key, Object value) {
            String header = (((String) key) + " " + value).trim();
            if (header.startsWith("[") && header.endsWith("]"))
                return result.put(header.substring(1, header.length() - 1), 
                        section = new Properties());
            else
                return section.put(key, value);
        }

    }.load(reader);
    return result;
}

Eine weitere Option ist Apache Commons Config auch eine Klasse zum Laden hat von INI-Dateien . Es hat einige Laufzeit Abhängigkeiten , aber für INI-Dateien nur Commons Sammlungen erfordern sollte, lang, und Protokollierung.

Ich habe mit ihren Eigenschaften und XML-Konfigurationen Commons Config an Projekten verwendet. Es ist sehr einfach zu bedienen und unterstützt einige recht leistungsstarke Funktionen.

Sie könnten versuchen, JINIFile. Ist eine Übersetzung der TIniFile von Delphi, aber für Java

https://github.com/SubZane/JIniFile

Ich persönlich bevorzugen Confucious .

Es ist schön, da es keine externen Abhängigkeiten benötigt, es ist winzig - nur 16K, und lädt automatisch Ihre INI-Datei bei der Initialisierung. Z.

Configurable config = Configuration.getInstance();  
String host = config.getStringValue("host");   
int port = config.getIntValue("port"); 
new Connection(host, port);

Es ist genauso einfach wie die .....

//import java.io.FileInputStream;
//import java.io.FileInputStream;

Properties prop = new Properties();
//c:\\myapp\\config.ini is the location of the ini file
//ini file should look like host=localhost
prop.load(new FileInputStream("c:\\myapp\\config.ini"));
String host = prop.getProperty("host");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top