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 数字        

 

转载于:https://www.cnblogs.com/VR-Tian/p/9256583.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值