0

我想知道是否可以像 ArrayList 一样在选定行处/从简单文本文件中保存和加载数据?

4

2 回答 2

2

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

如果您使用的是 .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);

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

于 2012-06-02T08:14:25.020 回答
0

在大多数情况下,我都支持 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();
于 2012-06-02T09:26:07.040 回答