C# 从FileStream和StreamRaeder读取与编码的差异?
由于我要从中读取的文件存在问题(当我尝试读取该文件时使用word打开该文件。Open variant失败,我必须使用FileStream+StreamReader来避免该问题),我必须从使用file.Open和使用生成的FileStream来读取切换到C# 从FileStream和StreamRaeder读取与编码的差异?,c#,file-io,encoding,C#,File Io,Encoding,由于我要从中读取的文件存在问题(当我尝试读取该文件时使用word打开该文件。Open variant失败,我必须使用FileStream+StreamReader来避免该问题),我必须从使用file.Open和使用生成的FileStream来读取切换到 using (StreamReader sourceStream = new StreamReader( new FileStream(filePath, FileMode.Open,
using (StreamReader sourceStream =
new StreamReader(
new FileStream(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite),
Encoding.Default))
然后使用生成的streamreader读取文件
现在我想知道的是:当我现在读取一个字符数组并使用一个编码(Encoding.Default)时,在编码方面是否有什么不同于我以前的变体(在我使用File.Open之前,然后从文件流中读取一个字节数组)。因此,我现在在编码方面必须比以前更加谨慎吗?为什么要使用
StreamReader
?它被设计为读取字符而不是字节,这就是为什么它需要一个编码参数。
您可以使用FileStream.read
或FileStream.ReadByte
方法直接从FileStream
读取
UPD:
和File.Open
static方法具有与“FileStream”构造函数相同的所有参数。所以你不能把同样的参数传递给那个方法吗
public static FileStream Open(
string path,
FileMode mode,
FileAccess access,
FileShare share
)
UPD2:
您可以阅读下面的控制台应用程序以查看差异。只需将文件路径更改为任何UTF8编码的文本文件
using System;
using System.Text;
using System.IO;
namespace FileReadTest
{
class Program
{
private static void Main(string[] args)
{
string fileName = "d:\\utf.txt";
Console.WriteLine("Reding using File.Open");
using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
int oneByte = stream.ReadByte();
while (oneByte != -1)
{
Console.WriteLine(oneByte);
oneByte = stream.ReadByte();
}
};
Console.WriteLine("Reading using StreamReader");
using (
StreamReader sourceStream =
new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),
Encoding.Default))
{
int oneChar = sourceStream.Read();
while (oneChar != -1)
{
Console.WriteLine(oneChar);
oneChar = sourceStream.Read();
}
}
}
}
}
我使用了包含“123abc”的文件,它在UTF8编码的开头包含一些标记字节。如果您将一些特定符号(如俄语或汉语)放入此文件中,输出将更加明显。好的观点。只是尝试了一下,发现它仍然可以在直接使用FileStream的情况下运行(不知道为什么在我的第一次测试中失败了,可能是因为写入错误)。虽然我仍然对原始问题感兴趣,但如果相同文件的结果不同,一个字符可以包含多个字节,具体取决于编码。所以,如果您读取字符数组(第一种情况),您可以得到与读取字节数组不同的结果。问题是如何将获取的字符转换为字节并存储到数组。我在回答中测试了您的评论:是的,只要相应地设置了fileshare,fileopen或filestream都无所谓(我从stackoverflow上的另一篇文章复制了filesrteam变体)。所以区别在于我担心编码会有问题,一个字符有多个字节,。。。tnx