一个例子(可能不是现实生活,但要说明我的观点):
public void StreamInfo(StreamReader p)
{
string info = string.Format(
"The supplied streamreaer read : {0}\n at line {1}",
p.ReadLine(),
p.GetLinePosition()-1);
}
Run Code Online (Sandbox Code Playgroud)
GetLinePosition这是streamreader的虚构扩展方法.这可能吗?
当然,我可以自己计算,但这不是问题.
我使用以下代码解压缩GZipStream(使用DotNetZip库),其中fs是指向gz文件的文件流(使用FileMode.Open,FileAccess.Read,FileShare.ReadWrite):
using (var gz = new GZipStream(fs, CompressionMode.Decompress)) {
using (var sr = new StreamReader(gz)) {
header = sr.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果直到最后才读取文件(我不喜欢这样做,因为文件可能很大),它会抛出
ZlibException("Bad CRC32 in GZIP trailer. (actual(EC084966)!=expected(8FC3EF16))")
在第一个结束括号(实际上当试图关闭()StreamReader时.
现在如果在关闭流读取器之前调用ReadToEnd()(或者我使用while(!sr.EndOfStream)循环读取所有行),它就可以工作.我观察到500 MB和200 kB压缩文件的相同行为,因此它似乎与文件大小无关.
非常欢迎您的见解!
它适用于System.IO.GZipStream库,所以这很奇怪.
我想在MemoryStream中打开一个XML文件(来自zip存档),并在此流中创建一个StreamReader,将其放入GridView中.
我用这个代码:
MemoryStream ms = new MemoryStream();
entry.Extract(ms);
StreamReader reader = new StreamReader(ms);
DataSet ds = new DataSet();
ds.ReadXml(reader);
dataGridView1.DataSource = GlobalDs.Tables[0];
Run Code Online (Sandbox Code Playgroud)
如果我的XML文件是用ANSI编码的,那么它可以很好地工作.但是当我加载以UTF8编码的文件时,它会失败,即使我初始化StreamReader如下:
StreamReader reader = new StreamReader(ms, System.Text.Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)
我希望有人有想法解决我的问题.
我有一个简单的程序来使用StreamReader读取文件并逐行处理.但我正在阅读的文件有时可能位于网络文件夹中.我在使用这样的文件进行一些测试时遇到过,如果网络连接在我正在读取的某个时刻丢失,它将再次保持在同一行,并且在无限循环中循环,产生与结果相同的行来自stream.ReadLine().
有什么方法可以在流本身没有fileHandle时找到?我期待FileReotAvailableException类型的异常会在StreamReader丢失文件句柄时触发.
这是我的代码片段......
string file = @"Z://1601120903.csv"; //Network file
string line;
StringBuilder stb = new StringBuilder();
StreamReader stream = new StreamReader(file, Encoding.UTF8, true, 1048576);
do
{
line = stream.ReadLine();
// Do some work here
} while (line != "");
Run Code Online (Sandbox Code Playgroud) 我需要使用此构造函数public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)才能设置leaveOpen为true.为了做到这一点,我还需要设置其他参数(Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize).我想按StreamReader原样使用,所以我不想给出一些随机值.这些参数的默认值是什么?
顺便说一下,我知道我可以StreamReader不用using.GC会在不触及流的情况下摆脱它.
我写了一个C#程序来读取Excel .xls/.xlsx文件并输出到CSV和Unicode文本.我写了一个单独的程序来删除空白记录.这是通过读取每一行来完成的StreamReader.ReadLine(),然后通过字符串逐个字符地进行,如果它包含所有逗号(对于CSV)或所有选项卡(对于Unicode文本),则不将该行写入输出.
当Excel文件在单元格内包含嵌入的换行符(\ x0A)时,会发生此问题.我将我的XLS更改为CSV转换器以找到这些新行(因为它逐个单元格)并将它们写为\ x0A,而普通行只使用StreamWriter.WriteLine().
在单独的程序中发生问题以删除空白记录.当我读入时StreamReader.ReadLine(),根据定义它只返回带有行的字符串,而不是终止符.由于嵌入的换行符显示为两个单独的行,我无法分辨哪个是完整记录,哪个是我将它们写入最终文件时的嵌入式换行符.
我甚至不确定我能读到\ x0A,因为输入上的所有内容都注册为'\n'.我可以逐字逐句,但这会破坏我删除空行的逻辑.
如果我使用FileStream创建StreamReader,关闭FileStream时StreamReader会关闭还是我还需要关闭StreamReader?
public void ReadFile()
{
var file = new FileStream("c:\file.txt", FileMode.Open, FileAccess.Read);
var reader = new StreamReader(file);
try
{
txtFile.Text = reader.ReadToEnd();
}
catch (Exception)
{
throw;
}
finally
{
file.Close();
}
}
Run Code Online (Sandbox Code Playgroud) 我对StreamReader的缓冲区使用有疑问.在这里:http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx你可以看到:
"当从Stream读取时,使用与流的内部缓冲区大小相同的缓冲区会更有效."
根据这个博客,StreamReader的内部缓冲区大小是2k,所以我可以使用Read()避免来有效地读取一些kbs的文件Read(Char[], Int32, Int32).
而且,即使文件很大,我也可以构造StreamReader传递缓冲区的大小
那么外部缓冲区的需求是什么?
以下是我一直在使用的内容.虽然它确实有效,但我的程序在尝试计算一个相当大的文件时会锁定,例如10,000行或更多行.较小的文件立即运行.
是否有更好的或者我应该说更快的方式来计算文本文件中的行?
这是我目前正在使用的:
Dim selectedItems = (From i In ListBox1.SelectedItems).ToArray()
For Each selectedItem In selectedItems
ListBox2.Items.Add(selectedItem)
ListBox1.Items.Remove(selectedItem)
Dim FileQty = selectedItem.ToString
'reads the data file and returns the qty
Dim intLines As Integer = 0
'Dim sr As New IO.StreamReader(OpenFileDialog1.FileName)
Dim sr As New IO.StreamReader(TextBox1_Path.Text + "\" + FileQty)
Do While sr.Peek() >= 0
TextBox1.Text += sr.ReadLine() & ControlChars.CrLf
intLines += 1
Loop
ListBox6.Items.Add(intLines)
Next
Run Code Online (Sandbox Code Playgroud) 我试图从数据库中复制字节流,对其进行编码,最后将其显示在网页上.但是,我注意到以不同方式编码内容的不同行为(注意:我使用的是"西欧"编码,它具有拉丁字符集且不支持中文字符):
var encoding = Encoding.GetEncoding(1252 /*Western European*/);
using (var fileStream = new StreamReader(new MemoryStream(content), encoding))
{
var str = fileStream.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)
比.
var encoding = Encoding.GetEncoding(1252 /*Western European*/);
var str = new string(encoding.GetChars(content));
Run Code Online (Sandbox Code Playgroud)
如果内容包含中文字符,则第一个代码块将产生一个类似"D $教学而设计的"的字符串,这是不正确的,因为编码不应该支持这些字符,而第二个块将产生"D $æ• ™å||€Œè®¾è®¡ç"""这是正确的,因为这些都是西欧字符集.
这种行为差异的解释是什么?
streamreader ×10
c# ×9
.net ×2
.net-3.5 ×1
buffer ×1
buffering ×1
compression ×1
default ×1
filestream ×1
gzip ×1
memorystream ×1
newline ×1
readline ×1
streaming ×1
text-files ×1
vb.net ×1