为了慢慢占用每个人的内存,Java将这些文件扩展为“.properties”,这些文件基本上是一个充满键值对的ASCII文本文件。该框架有一些非常简单的方法可以将该文件吸入(基本上)一个花哨的hashmap。
两个巨大的优势(我认为)是手工编辑和阅读/写作极其容易。
.NET是否有相同的烘焙?当然,我可以用XML文件做同样的事情,但如果你知道我的意思,我宁可不要手工输入所有尖括号。此外,将所有数据吸入内存中的数据结构的方法也很不错。
(补充工具栏:我有点不相信这里已经没有问过了,但我找不到这样的问题。)
编辑:
为了回答一些评论暗示的问题,我不是在寻找一种专门阅读.NET下java .properties文件的方法,我正在寻找.NET领域中的功能等价物。 (而且我希望它不会基于XML,显然已经忘记了这是我们正在讨论的.NET。)
而且,虽然配置文件 close ,但我需要存储一些任意字符串,而不是app配置信息,所以配置文件的焦点和设计似乎偏离基础。
答案 0 :(得分:13)
您可以使用内置的settings files(在VS中添加新的“设置文件”)为属性文件实现类似的功能 - 但它仍然是基于XML的。
您可以使用自动生成的Settings类访问这些设置,甚至可以更新它们并将它们保存回配置文件 - 所有这些都无需编写任何样板代码。设置是强类型,可以指定为“用户”(保存到用户的Application Data文件夹)或“Application”(保存到与正在运行的exe相同的文件夹中)。
答案 1 :(得分:8)
.NET的方式是使用configuration file。 .NET框架甚至提供 an API for working with them
答案 2 :(得分:5)
举个例子:
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
。
答案 3 :(得分:2)
我无法使用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。
答案 4 :(得分:1)
我编写了一个名为DotNet.Config的小型.NET配置库,它使用受Java的.property文件启发的基于文本的简单属性文件。它包括一些很好的功能,便于加载。你可以在这里获取一份副本:
答案 5 :(得分:0)
我个人喜欢我在网上找到的这段代码。它是一种在属性文件中读/写的个性化方式。
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()