C#中FileStream.Read方法的buffer大小不一样读取结果不一样??
看下面的程序,我从一个已有文件的FileStream里读取bytes,读到buffer里转为字符串,循环,最后写到richTextBox1.Text和用fs2创建相同文件...
看下面的程序,我从一个已有文件的FileStream里读取bytes,读到buffer里转为字符串,循环,最后写到 richTextBox1.Text 和用fs2创建相同文件。
奇怪的是::为什么我用buffer的长度很小与很大时结果不一样?(都不是我想要的结果)
能详细说一下read的过程吗?buffer应该设置成多大?
FileStream fs = File.OpenRead("1.txt");
int count = 1;
byte[] buffer = new byte[4096];
FileStream fs2 = new FileStream("2.txt", FileMode.Create); ;
while (count != 0)
{
count = fs.Read(buffer, 0, buffer.Length);
string str = System.Text.Encoding.ASCII.GetString(buffer);
richTextBox1.Text += str;
fs2.Write(buffer, 0, buffer.Length);
}
fs2.Close();
--->>非常感谢大哥的回答,确实解决了,可是又有问题,如果是网络传输怎么办?不知道文件大小啊
TcpClient类有属性ReceiveBufferSize和SendBufferSize,他们与用来读取的buffer怎么协调呢?
------------------------------------------------------------------------------------------------------------------ 展开
奇怪的是::为什么我用buffer的长度很小与很大时结果不一样?(都不是我想要的结果)
能详细说一下read的过程吗?buffer应该设置成多大?
FileStream fs = File.OpenRead("1.txt");
int count = 1;
byte[] buffer = new byte[4096];
FileStream fs2 = new FileStream("2.txt", FileMode.Create); ;
while (count != 0)
{
count = fs.Read(buffer, 0, buffer.Length);
string str = System.Text.Encoding.ASCII.GetString(buffer);
richTextBox1.Text += str;
fs2.Write(buffer, 0, buffer.Length);
}
fs2.Close();
--->>非常感谢大哥的回答,确实解决了,可是又有问题,如果是网络传输怎么办?不知道文件大小啊
TcpClient类有属性ReceiveBufferSize和SendBufferSize,他们与用来读取的buffer怎么协调呢?
------------------------------------------------------------------------------------------------------------------ 展开
展开全部
如果不知道原文件的大小,可以这样:
FileStream fs2 = new FileStream("2.txt", FileMode.Create);
byte[] buffer = new byte[4096];//这里的大小可以设置为ReceiveBufferSize
while ((count = fs.Read(buffer, 0, buffer.Length)) != 0)
{
buffer.Initialize();//将buffer初始化,避免出现后半部不更新的情况。
string str = System.Text.Encoding.ASCII.GetString(buffer);
str = str.TrimEnd('\0');//将后面冗余的'\0'去掉
richTextBox1.Text += str;
fs2.Write(buffer,0, str.Length);//注意这里取得是str的长度而不是buffer的长度。
}
fs2.Close();
——————————————
简单分析一下:
1.buffer长度较小,不会一次从fs中读取所有数据。那么在倒数第二次取完byte之后,最后一次可能会出现剩余的待取字节不足buffer长度的情况,buffer只有前半部分被更新,后面剩余了倒数第二次取得的字节。所以会有冗余的字节存在buffer里面,写出来的时候相应的冗余字节也被存到文件和richText里面了。
2.buffer长度很大,一次能从fs里取完所有字节。此时在richeText里面看到的是正常的。但由于buffer后面还有大量的空余字节,而且它们被初始化为“\0”,所以存在txt文件中会显示为空格。而且txt的文件大小也等同于buffer的大小而不是原文件的大小。
解决办法:
将buffer的大小设为fs字节流同样的大小。即:
FileStream fs = File.OpenRead("1.txt");
int count = 1;
FileStream fs2 = new FileStream("2.txt", FileMode.Create);
byte[] buffer = new byte[fs.Length];
就可以解决上述问题了。
FileStream fs2 = new FileStream("2.txt", FileMode.Create);
byte[] buffer = new byte[4096];//这里的大小可以设置为ReceiveBufferSize
while ((count = fs.Read(buffer, 0, buffer.Length)) != 0)
{
buffer.Initialize();//将buffer初始化,避免出现后半部不更新的情况。
string str = System.Text.Encoding.ASCII.GetString(buffer);
str = str.TrimEnd('\0');//将后面冗余的'\0'去掉
richTextBox1.Text += str;
fs2.Write(buffer,0, str.Length);//注意这里取得是str的长度而不是buffer的长度。
}
fs2.Close();
——————————————
简单分析一下:
1.buffer长度较小,不会一次从fs中读取所有数据。那么在倒数第二次取完byte之后,最后一次可能会出现剩余的待取字节不足buffer长度的情况,buffer只有前半部分被更新,后面剩余了倒数第二次取得的字节。所以会有冗余的字节存在buffer里面,写出来的时候相应的冗余字节也被存到文件和richText里面了。
2.buffer长度很大,一次能从fs里取完所有字节。此时在richeText里面看到的是正常的。但由于buffer后面还有大量的空余字节,而且它们被初始化为“\0”,所以存在txt文件中会显示为空格。而且txt的文件大小也等同于buffer的大小而不是原文件的大小。
解决办法:
将buffer的大小设为fs字节流同样的大小。即:
FileStream fs = File.OpenRead("1.txt");
int count = 1;
FileStream fs2 = new FileStream("2.txt", FileMode.Create);
byte[] buffer = new byte[fs.Length];
就可以解决上述问题了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询