繁体   English   中英

.NET是否具有与Java的.properties文件相同的功能?

[英]Does .NET have an equivalent to Java's .properties files?

为了慢慢占用每个人的内存,Java将这些文件扩展为“.properties”,这些文件基本上是一个充满键值对的ASCII文本文件。 该框架有一些非常简单的方法将该文件吸入(基本上)一个花哨的hashmap。

两个巨大的优势(我认为)是手工编辑和阅读/写作的极易。

.NET是否有相同的烘焙? 当然,我可以用XML文件做同样的事情,但如果你知道我的意思,我宁愿不必手动输入所有尖括号。 此外,将所有数据吸入内存中的数据结构的方法也很好。

(侧栏:我有点不敢相信这里已经没有问过了,但我找不到这样的问题。)

编辑:

为了回答一些评论暗示的问题,我不是在寻找一种在.NET下专门阅读java .properties文件的方法,我正在寻找.NET领域中的功能等价物。 (而且我希望它不会基于XML,显然已经忘记了这是我们正在讨论的.NET。)

并且,虽然配置文件很接近 ,但我需要存储一些任意字符串,而不是应用程序配置信息,所以配置文件的焦点和设计似乎是偏离基础的。

您可以使用内置的设置文件在属性文件中实现类似的功能(在VS中,添加新的“设置文件”) - 但它仍然是基于XML的。

您可以使用自动生成的Settings类访问设置,甚至更新它们并将它们保存回配置文件 - 所有这些都不需要编写任何样板代码。 设置是强类型,可以指定为“用户”(保存到用户的Application Data文件夹)或“Application”(保存到与正在运行的exe相同的文件夹中)。

.NET方式是使用配置文件 .NET框架甚至提供了一个用于处理它们的API

有一个名为nini的第三方组件可以在sourceforge.net找到

举个例子:

using Nini;
using Nini.Config;

namespace niniDemo{
   public class niniDemoClass{
       public bool LoadIni(){
            string configFileName = "demo.ini";
            IniConfigSource configSource = new IniConfigSource(configFileName);

            IConfig demoConfigSection = configSource.Configs["Demo"];
            string demoVal = demoConfigSection.Get("demoVal", string.Empty);
       }
   }

}

上面示例的'demo.ini'文件将是:

[Demo]
demoVal = foobar

如果demoVal值为null或为空,则默认为string.Empty

我没能通过使用c#找到读取属性文件的similer解决方案。 我能够使用c#编写自己的代码,获得与java相同的结果。

以下是代码:

 // watchValue- Property attribute which you need to get the value;
 public string getProperty(string watchValue) 
    {
       // string propertiesfilename= @"readFile.properties";

        string[] lines = System.IO.File.ReadAllLines(propertiesfilename);
            for (int i = 0; i < lines.Length; i++)
            {
                string prop_title = Regex.Split(lines[i], "=")[0].Trim();
                if (prop_title == watchValue)
                    return Regex.Split(lines[i], "=")[1].Trim();
            }
            return null;
    }

我的想法-

我个人认为,与访问XML文件相比,属性文件访问对用户来说要容易得多。

因此,如果您尝试更好地外化某些属性属性以使用属性文件而不是XML。

我编写了一个名为DotNet.Config的小型.NET配置库,它使用受Java的.property文件启发的基于文本的简单属性文件。 它包括一些很好的功能,便于加载。 你可以在这里抓一份:

https://github.com/jknight/DotNet.Config

我个人喜欢我在网上找到的这段代码。 它是一种在属性文件中读/写的个性化方式。

public class Properties
{
    private Dictionary<String, String> list;

    private String filename;

    public Properties(String file)
    {
        reload(file);
    }

    public String get(String field, String defValue)
    {
        return (get(field) == null) ? (defValue) : (get(field));
    }
    public String get(String field)
    {
        return (list.ContainsKey(field))?(list[field]):(null);
    }

    public void set(String field, Object value)
    {
        field = this.trimUnwantedChars(field);
        value = this.trimUnwantedChars(value);

        if (!list.ContainsKey(field))
            list.Add(field, value.ToString());
        else
            list[field] = value.ToString();
    }

    public string trimUnwantedChars(string toTrim)
    {
        toTrim = toTrim.Replace(";", string.Empty);
        toTrim = toTrim.Replace("#", string.Empty);
        toTrim = toTrim.Replace("'", string.Empty);
        toTrim = toTrim.Replace("=", string.Empty);
        return toTrim;
    }

    public void Save()
    {
        Save(this.filename);
    }

    public void Save(String filename)
    {
        this.filename = filename;

        if (!System.IO.File.Exists(filename))
            System.IO.File.Create(filename);

        System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

        foreach(String prop in list.Keys.ToArray())
            if (!String.IsNullOrWhiteSpace(list[prop]))
                file.WriteLine(prop + "=" + list[prop]);

        file.Close();
    }

    public void reload()
    {
        reload(this.filename);
    }

    public void reload(String filename)
    {
        this.filename = filename;
        list = new Dictionary<String, String>();

        if (System.IO.File.Exists(filename))
            loadFromFile(filename);
        else
            System.IO.File.Create(filename);
    }

    private void loadFromFile(String file)
    {
        foreach (String line in System.IO.File.ReadAllLines(file))
        {
            if ((!String.IsNullOrEmpty(line)) &&
                (!line.StartsWith(";")) &&
                (!line.StartsWith("#")) &&
                (!line.StartsWith("'")) &&
                (line.Contains('=')))
            {
                int index = line.IndexOf('=');
                String key = line.Substring(0, index).Trim();
                String value = line.Substring(index + 1).Trim();

                if ((value.StartsWith("\"") && value.EndsWith("\"")) ||
                    (value.StartsWith("'") && value.EndsWith("'")))
                {
                    value = value.Substring(1, value.Length - 2);
                }

                try
                {
                    //ignore duplicates
                    list.Add(key, value);
                }
                catch { }
            }
        }
    }
}

用法示例:

//load
Properties config = new Properties(fileConfig);
//get value whith default value
com_port.Text = config.get("com_port", "1");
//set value
config.set("com_port", com_port.Text);
//save
config.Save()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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