StreamReader读取照片引发的惨案和思考

起因

为备份系统里面的照片,写了一个程序定时完成拷贝,脑子里构思了大概的步骤,凭着“肌肉记忆”写到了读取相片的操作,简写如下代码:

            char[] buffer;
            using (var sr = new StreamReader(@"C:\小妹妹.jpg", Encoding.Default))
            {
                buffer = new Char[(int)sr.BaseStream.Length];
                sr.Read(buffer, 0, (int)sr.BaseStream.Length);
            }

            using (var sw = new StreamWriter(@"C:\小姐姐.jpg", false, Encoding.Default))
            {
                sw.Write(buffer);
            }

结果

满心欣喜打开拷贝的照片发现出现格式损坏问题,自然就定位到了buffer变量的身上,为何会出现格式损坏(明明使用了默认编码读写),就一路找资料,但找不到相关问题,最后去到MSDN

StreamReader是抽象 TextReader的实现,使其以一种特定的编码从字节流中读取对应的字符(而不是字节,最后使用官方结尾:

TextReader is the abstract base class of StreamReader and StringReader, which read characters from streams and strings, respectively。

Use these derived classes to open a text file for reading a specified range of characters, or to create a reader based on an existing stream。

 

思考

若要获取文件内容的字节,可以使用“FileStream”,简单代码如下:

           using (Stream fileReader = new FileStream(@"C:\源文件.jpg", FileMode.Open))
            {
                byte[] bytebuffer;
                bytebuffer = new byte[fileReader.Length];
                fileReader.Read(bytebuffer, 0, (int)fileReader.Length);
                var fileStream = new FileStream(@"C:\拷贝文件.jpg", FileMode.Create);
                fileStream.Write(bytebuffer, 0, bytebuffer.Length);
            }    

可以看出FileStream操作文件的buffer的需要用“Byte”类型的作为缓冲器的,而不是”Char“类型,这说明本身对于基本类型和具体API操作类了解不够,谨以此文重新学习

            int  number= 88;
            char ch = (char)number;//X 字符
            byte by = (byte)number;//88 数字        

 

posted @ 2018-07-03 16:18  VR-Tian  阅读(180)  评论(0)    收藏  举报