gpt4 book ai didi

c# - StreamReader 太贪心了

转载 作者:行者123 更新时间:2023-12-02 14:05:24 25 4
gpt4 key购买 nike

我正在尝试处理文本文件的一部分,并使用 UploadFromStream 将文本文件的其余部分写入云 blob。问题在于 StreamReader 似乎从底层流中获取了太多内容,因此后续写入不会执行任何操作。

文本文件:

3
Col1,String
Col2,Integer
Col3,Boolean
abc,123,True
def,3456,False
ghijkl,532,True
mnop,1211,False

代码:

using (var stream = File.OpenRead("c:\\test\\testinput.txt"))
using (var reader = new StreamReader(stream))
{
var numColumns = int.Parse(reader.ReadLine());
while (numColumns-- > 0)
{
var colDescription = reader.ReadLine();
// do stuff
}

// Write remaining contents to another file, for testing
using (var destination = File.OpenWrite("c:\\test\\testoutput.txt"))
{
stream.CopyTo(destination);
destination.Flush();
}

// Actual intended usage:
// CloudBlockBlob blob = ...;
// blob.UploadFromStream(stream);
}

调试时,我观察到 stream.Position 在第一次调用 reader.ReadLine() 时跳转到文件末尾,这是我不期望的。我预计流只会前进到读者阅读某些内容所需的位置。

我认为流读取器出于性能原因正在做一些缓冲,但似乎没有办法询问读取器它“真正”在底层流中的哪个位置。 (如果有的话,我可以在CopyingTo之前手动Seek流到该位置)。

我知道我可以继续使用同一个阅读器获取行并按顺序将它们附加到我正在编写的文本文件中,但我想知道是否有更干净的方法?

编辑:

我发现了一个 StreamReader 构造函数,它在释放底层流时将其保持打开状态,因此我尝试了此操作,希望读者能够在释放流时设置流的位置:

using (var stream = File.OpenRead("c:\\test\\testinput.txt"))
{
using (var reader = new StreamReader(stream, Encoding.UTF8,
detectEncodingFromByteOrderMarks: true,
bufferSize: 1 << 12,
leaveOpen: true))
{
var numColumns = int.Parse(reader.ReadLine());
while (numColumns-- > 0)
{
var colDescription = reader.ReadLine();
// do stuff
}
}

// Write remaining contents to another file
using (var destination = File.OpenWrite("c:\\test\\testoutput.txt"))
{
stream.CopyTo(destination);
destination.Flush();
}
}

但事实并非如此。如果这个构造函数没有使流处于直观的状态/位置,为什么会暴露它?

最佳答案

当然,有一种更干净的方法。使用ReadToEnd读取剩余数据,然后将其写入新文件。例如:

using (var reader = new StreamReader("c:\\test\\testinput.txt"))
{
var numColumns = int.Parse(reader.ReadLine());
while (numColumns-- > 0)
{
var colDescription = reader.ReadLine();
// do stuff
}

// write everything else to another file.
File.WriteAllText("c:\\test\\testoutput.txt", reader.ReadToEnd());
}

评论后编辑

如果您想读取文本并将其上传到流,您可以将 File.WriteAllText 替换为读取剩余文本的代码,并将其写入 StreamWriter > 由 MemoryStream 支持,然后发送该 MemoryStream 的内容。像这样的东西:

    using (var memStream = new MemoryStream())
{
using (var writer = new StreamWriter(memStream))
{
writer.Write(reader.ReadToEnd());
writer.Flush();
memStream.Position = 0;
blob.UploadFromStream(memStream);
}
}

关于c# - StreamReader 太贪心了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com