NET是否有与Java';属性文件?

NET是否有与Java';属性文件?,java,.net,properties-file,Java,.net,Properties File,为了让每个人都能记住,Java有扩展名为“.properties”的文件,这些文件基本上是一个包含键值对的ASCII文本文件。该框架有一些非常简单的方法,可以将该文件(本质上)吸收到一个奇特的hashmap中 在我看来,这两大优势是,手工编辑和阅读/写作都非常容易 NET是否有一个等效的插件?当然,我也可以对XML文件执行同样的操作,但如果您知道我的意思,我不想手动键入所有这些尖括号。另外,一种将所有数据吸入内存中一行数据结构的方法也很好 (旁白:我不敢相信这里还没有人问过这个问题,但我找不到这

为了让每个人都能记住,Java有扩展名为“.properties”的文件,这些文件基本上是一个包含键值对的ASCII文本文件。该框架有一些非常简单的方法,可以将该文件(本质上)吸收到一个奇特的hashmap中

在我看来,这两大优势是,手工编辑和阅读/写作都非常容易

NET是否有一个等效的插件?当然,我也可以对XML文件执行同样的操作,但如果您知道我的意思,我不想手动键入所有这些尖括号。另外,一种将所有数据吸入内存中一行数据结构的方法也很好

(旁白:我不敢相信这里还没有人问过这个问题,但我找不到这样的问题。)

编辑:

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

而且,当配置文件关闭时,我需要一种存储一些任意字符串的方法,而不是应用程序配置信息,因此配置文件的重点和设计似乎偏离了基准。

NET的方法是使用。NET框架甚至提供了
.

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


您可以使用自动生成的设置类访问这些设置,甚至可以更新它们并将它们保存回配置文件,而无需编写任何样板代码。设置是强类型,可以指定为“用户”(保存到用户的应用程序数据文件夹)或“应用程序”(保存到与正在运行的exe相同的文件夹)。

有一个名为nini的第三方组件,可在

例如:

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); } } } 使用Nini; 使用Nini.Config; 名称空间niniDemo{ 公营九面舱{ 公共bool LoadIni(){ 字符串configFileName=“demo.ini”; IniConfigSource configSource=新的IniConfigSource(configFileName); IConfig demoConfigSection=configSource.Configs[“Demo”]; string demoVal=demoConfigSection.Get(“demoVal”,string.Empty); } } } 上述示例的“demo.ini”文件为:

[Demo] demoVal = foobar [演示] demoVal=foobar
如果
demoVal
的值为null或空,则默认为
string.empty
我个人喜欢在Web上找到的这段代码。这是一种在属性文件中读/写的个性化方式

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

我无法通过使用c#为读取属性文件找到更类似的解决方案。我能够使用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;
    }
//watchValue—获取值所需的属性;
公共字符串getProperty(字符串watchValue)
{
//字符串属性filename=@“readFile.properties”;
string[]lines=System.IO.File.ReadAllLines(propertiesfilename);
对于(int i=0;i
我的想法-

我个人认为属性文件访问比访问XML文件更容易


因此,如果您试图将某些属性外部化,最好使用属性文件而不是XML。

我编写了一个名为的小型.NET配置库,它使用了受Java的.property文件启发的简单的基于文本的属性文件。它包括一些很好的特性,便于加载。您可以在此处获取副本:


有一个dup:这些看起来很相似:根据作者的意图,这可能不是dup。(尽管这似乎是因为作者并不热衷于XML)Andrew Hare已经提供了唯一可能的答案,如果这不是dup的话;我只是想知道.net的等价物是什么。(并且希望得到一个非基于xml的解决方案,但话说回来,这是我们正在谈论的.net。)我将整理问题中的文本,使其更加清晰。另外:谢谢大家!啊哈!这正是我想要的。谢谢哦,太好了。很高兴知道!谢谢配置文件不是只用于应用程序配置数据吗?我真的只想用一种简单的方法从文本文件中提取一些字符串。我不希望框架认为我正在尝试配置某些东西。:)您应该添加一个检查,以确保键不以
;#开头
和不包含
=
。您应该将它们转义(
\
\\\
),而不是删除它们。根据
 // 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;
    }