سؤال

وأنا أكتب بديل الإفلات في لتركة التطبيق في جاوة. أحد المتطلبات هو أن ملفات INI أن تطبيق السن المستخدمة يجب أن تكون قراءة كما هو في تطبيق جافا جديد. شكل هذا ملفات INI هو نمط النوافذ المشترك، مع مقاطع رأس ومفتاح = أزواج القيمة، وذلك باستخدام # كحرف للتعليق.

وحاولت استخدام الطبقة خصائص من جاوة، ولكن بالطبع هذا لن تعمل إذا كان هناك اشتباكات بين اسم رؤوس مختلفة.

ولذا فإن السؤال هو، ماذا سيكون أسهل طريقة لقراءة في هذا الملف INI والوصول إلى المفاتيح؟

هل كانت مفيدة؟

المحلول

والمكتبة لقد استعملت هو ini4j . انها خفيفة الوزن ويوزع ملفات INI مع سهولة. كما أنه لا يستخدم تبعيات الباطنية إلى 10،000 الملفات جرة الأخرى، باعتبارها واحدة من أهداف التصميم كان لاستخدام فقط في API جافا القياسية

وهذا مثال على كيفية استخدام المكتبة:

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));

نصائح أخرى

المذكورة و <لأ href = "http://ini4j.sourceforge.net/index.html" يختلط = " noreferrer "> ini4j يمكن استخدامها لتحقيق ذلك. اسمحوا لي أن تظهر سبيل المثال الآخر.

وإذا كان لدينا ملف INI مثل هذا:

[header]
key = value

وفيما يلي يجب عرض value إلى STDOUT:

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

الدروس لمزيد من الأمثلة.

وبهذه البساطة 80 خطوط:

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 ));
   }
}

وهنا مثال بسيط، لكنها قوية، باستخدام فئة اباتشي <لأ href = "http://commons.apache.org/proper/commons-configuration/javadocs/v1.10/apidocs/index.html؟org/ اباتشي / المشاعات / التكوين / HierarchicalINIConfiguration.html "يختلط =" noreferrer "> 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");
}

وتكوين العموم لديها عدد من وقت تبعيات . كحد أدنى، العموم لانغ و <لأ href = "http://commons.apache.org / تسجيل / "يختلط =" noreferrer "> مطلوبة المشاعات قطع الأشجار . اعتمادا على ما تفعلونه مع ذلك، قد تحتاج مكتبات إضافية (انظر الرابط السابق للحصول على التفاصيل).

وأو مع API جافا القياسية يمكنك استخدام جافا .util.Properties :

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

في 18 خطوط، وتوسيع java.util.Properties تحليل إلى أقسام متعددة:

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;
}

وثمة خيار آخر هو أباتشي العموم التكوين ديه أيضا فئة للتحميل من <لأ href = " http://commons.apache.org/configuration/apidocs/org/apache/commons/configuration/INIConfiguration.html "يختلط =" نوفولو noreferrer "> INI ملفات . لا توجد لديها بعض وقت تبعيات ، ولكن لملفات INI يجب أن لا تتطلب سوى مجموعات العموم، لانج، وقطع الأشجار.

ولقد استعملت التكوين العموم في مشاريع مع خصائص وتكوينات XML. فمن السهل جدا استخدام ويدعم بعض الميزات القوية جدا.

هل يمكن أن تحاول JINIFile. هي ترجمة للTIniFile من دلفي، ولكن لجافا

https://github.com/SubZane/JIniFile

وأنا شخصيا أفضل كونفوشيوس .

وهذا هو لطيف، كما أنها لا تتطلب أي الاعتماد على الخارج، انها صغيرة - فقط 16K، ويقوم بتحميل ملف ini تلقائيا على التهيئة. منها مثلا.

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

وانها مجرد بسيطة مثل هذا .....

//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");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top