Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从FileStream和StreamRaeder读取与编码的差异?_C#_File Io_Encoding - Fatal编程技术网

C# 从FileStream和StreamRaeder读取与编码的差异?

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,

由于我要从中读取的文件存在问题(当我尝试读取该文件时使用word打开该文件。Open variant失败,我必须使用FileStream+StreamReader来避免该问题),我必须从使用file.Open和使用生成的FileStream来读取切换到

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