文件流.Read -不使用循环读取流

本文关键字:循环 读取 Read 文件 | 更新日期: 2023-09-27 18:02:21

如何在不使用循环的情况下读取文件流?当我使用这段代码时,它只读取5714字节而不是1048576字节

byte[] Buffer = new byte[1048576];
ByteSize = downloadstream.Read(Buffer, 0,Buffer.Lenght);

如果我使用这个循环,效果很好

while ((ByteSize = downloadstream.Read(Buffer, 0, Buffer.Length)) > 0)
{
    //write stream to file
}

那么我如何在不使用循环的情况下读取整个流呢?谢谢,非常感谢任何帮助。我必须把所有的数据读入缓冲区,然后再写入。对不起,我没有早点告诉你。

EDIT:您也可以使用这段代码一次将流读入缓冲区:

using (var streamreader = new MemoryStream())
            {
                stream.CopyTo(streamreader);
                buffer = streamreader.ToArray();
            }

文件流.Read -不使用循环读取流

如果您想在中一次读取整个文件,我建议使用File.ReadAllBytes来读取二进制文件:

 byte[] data = File.ReadAllBytes(@"C:'MyFile.dat");

File.ReadAllText/File.ReadAllLines的文本:

 string text = File.ReadAllText(@"C:'MyFile.txt");
 string[] lines = File.ReadAllText(@"C:'MyOtherFile.txt");

编辑:如果是web

  byte[] data;
  using (WebClient wc = new WebClient()) {
    wc.UseDefaultCredentials = true; // if you have a proxy etc.
    data = wc.DownloadData(myUrl); 
  }

myUrl@"https://www.google.com"时,我得到data.Length == 45846

假设您的文件包含文本,那么您可以使用流阅读器,只需将您的FileStream传递给构造函数(下面我创建了一个新的FileStream来打开文件):

using(StreamReader reader = new StreamReader(new FileStream("path", FileMode.Open)))
        {
            string data = reader.ReadToEnd();
        }

来自Stream.Read的文档:

返回值

类型:系统。Int32

读取到缓冲区的总字节数。如果当前没有那么多字节可用,此值可以小于请求的字节数,如果已到达流的末端,则为零(0)。

所以看起来Stream.Read读取小于缓冲区长度是完全合法的,只要它告诉你它是这样做的。