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