C# 是否在选定行保存并从文件加载?

C# 是否在选定行保存并从文件加载?,c#,C#,我想知道是否有可能像ArrayList一样,在选定行处/从选定行将数据保存并加载到一个简单的文本文件中 除非您的行都是相同的字节数,而不仅仅是字符数,否则通常情况下,在读取时不读取相关行之前的整个文件,或者在写入时重写文件的其余部分,这是不可能的。您不能只在文件中间插入或删除字节 如果您使用的是.NET 4,您可以很容易地在文件的第n行获取: string line = File.ReadLines("file.txt").ElementAt(lineNumber); 请注意,这将需要阅读前面

我想知道是否有可能像ArrayList一样,在选定行处/从选定行将数据保存并加载到一个简单的文本文件中

除非您的行都是相同的字节数,而不仅仅是字符数,否则通常情况下,在读取时不读取相关行之前的整个文件,或者在写入时重写文件的其余部分,这是不可能的。您不能只在文件中间插入或删除字节

如果您使用的是.NET 4,您可以很容易地在文件的第n行获取:

string line = File.ReadLines("file.txt").ElementAt(lineNumber);
请注意,这将需要阅读前面的所有文本

替换一行比较棘手-如果文件足够小,可以放入内存,最简单的方法是将整个文件读入一行数组,更改一行,然后再次写出整个内容:

string[] lines = File.ReadAllLines("file.txt");
lines[lineNumber] = replacementLine;
File.WriteAllLines("file.txt", lines);

有更有效的方法可以做到这一点,但要复杂得多。

在大多数情况下,我支持Skeet对这个问题的回答

对于性能要求证明需要额外编程的特定情况,可以使用类似于数据库的方法:维护一个索引结构,指定文件中每一行的偏移量。这个索引只需要在开始时创建一次,然后在任何文件修改之后在内存中更新。它可能会被持久化到磁盘,以便应用程序的后续运行

以下是初始化未测试为运行的索引的一些示例代码:

byte[] bytes = File.ReadAllBytes("source.txt");
var newlineIndexes = bytes.Select((byteValue, index) => new { byteValue, index })
                          .Where(p => p.byteValue == '\n' && 
                                      p.index < bytes.Length - 1)
                          .Select(p => p.index + 1);
var lineIndexes = (new int[] { 0 }).Concat(newlineIndexes).ToList();

这些线都一样长吗?是的,有可能。但要做到这一点,您必须编写自己的库。但是,如果您的库没有针对所有可能的文本文件的特定子集进行定制,那么您的库很可能会有较差的性能。我认为性能是这些功能不属于BCL的原因。你的确切意思是什么?读取文件开头以外的其他地方的内容?这与ArrayList有什么关系?适用于小文件,但适用于大文件?是的,有很多方法可以做到这一点@3D Kreativ,Java有一种处理随机访问文件的有效方法,但C如果要尝试处理随机访问文件,则必须知道每行的字节数,才能找到所需的行号。@Subs:Java与C或Java与.NET之间没有区别。C也支持随机访问——但在这两种平台上,您都需要知道要搜索的位置。您希望Java如何做得更好?@Subs:您仍然需要知道在哪里寻找。如果您知道要查找的位置,可以在.NET中的文件流上查找,然后创建一个封装它的StreamReader并从中读取一行。我还是不明白你怎么认为这有帮助。请注意,RandomAccessFile甚至不允许指定编码,这使得它更不有用。