关于BinaryReader读取数据:在构造函数中指定编码格式
2010-03-22 22:46
459 查看
问题描述:使用BinaryReader从文件中读取数据,开始在创建BinaryReader实例的时候,未指定编码格式,结果能通过编译,但是能在执行过程中会报错如下:“未处理的异常: System.ArgumentException: 输出字符缓冲区太小,无法包含解码后的字符,编码“Unicode (UTF-8)”的操作回退“System.Text.DecoderReplacementFallback”。”
解决过程:
首先附上创建文件的代码:
BinaryReader2
1 using System;
2 using System.IO;
3 using System.Text;
4
5 class binaryReader
6 {
7 static void Main()
8 {
9 FileInfo f2 = new FileInfo("BinFile2.dat");
10
11 BinaryReader br = new BinaryReader(f2.OpenRead(),Encoding.Default);
12 int temp = 0;
13 int count=20;
14 while (count>0)
15 {
16 Console.Write("{0,7:x}",br.ReadByte());
17
18 if (++temp == 4)
19 {
20 Console.WriteLine();
21 temp = 0;
22 }
23
24 count--;
25 }
26 Console.WriteLine();
27 }
28 }
结果,除了没能完全输出字符之外,运行正常,于是,问题集中在了PeekChar()上面。上面用它来判断文件的边界,MSDN中描述“下一个可用的字符,或者,如果没有可用字符或者流不支持查找时为 -1。”也就是说,PeekChar()在判断是否到边界的过程中,有一个预读的过程,结合上面的编码的问题,可以猜测,在它预读的时候由于编码的不合适,导致在该方法内部的缓冲区的溢出。
又在网上找到一文《不要使用PeekChar()判断EOF》,文中只是说不要用PeekChar来判断EOF,而是使用判断条件 ( br.BaseStream.Position < br.BaseStream.Length),但是并没有给出详细的理由。
而后,又发现了老外也在讨论这个问题:http://bytes.com/topic/visual-basic-net/answers/349779-binaryreader-peekchar-argumentexception-conversion-buffer-overflow
……
继续深入下去,有两个点要解决:1、UTF-8编码的问题;2、PeekChar的工作详细细节。
总结:通过以上的一系列做法,对BinaryReader的使用有了一些粗浅的了解,在使用过程中,能够合理利用,避开容易出错的地方,但是,根本的问题还未能真正解决。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
更深入的明日再续。
解决过程:
首先附上创建文件的代码:
BinaryReader2
1 using System;
2 using System.IO;
3 using System.Text;
4
5 class binaryReader
6 {
7 static void Main()
8 {
9 FileInfo f2 = new FileInfo("BinFile2.dat");
10
11 BinaryReader br = new BinaryReader(f2.OpenRead(),Encoding.Default);
12 int temp = 0;
13 int count=20;
14 while (count>0)
15 {
16 Console.Write("{0,7:x}",br.ReadByte());
17
18 if (++temp == 4)
19 {
20 Console.WriteLine();
21 temp = 0;
22 }
23
24 count--;
25 }
26 Console.WriteLine();
27 }
28 }
结果,除了没能完全输出字符之外,运行正常,于是,问题集中在了PeekChar()上面。上面用它来判断文件的边界,MSDN中描述“下一个可用的字符,或者,如果没有可用字符或者流不支持查找时为 -1。”也就是说,PeekChar()在判断是否到边界的过程中,有一个预读的过程,结合上面的编码的问题,可以猜测,在它预读的时候由于编码的不合适,导致在该方法内部的缓冲区的溢出。
又在网上找到一文《不要使用PeekChar()判断EOF》,文中只是说不要用PeekChar来判断EOF,而是使用判断条件 ( br.BaseStream.Position < br.BaseStream.Length),但是并没有给出详细的理由。
而后,又发现了老外也在讨论这个问题:http://bytes.com/topic/visual-basic-net/answers/349779-binaryreader-peekchar-argumentexception-conversion-buffer-overflow
……
继续深入下去,有两个点要解决:1、UTF-8编码的问题;2、PeekChar的工作详细细节。
总结:通过以上的一系列做法,对BinaryReader的使用有了一些粗浅的了解,在使用过程中,能够合理利用,避开容易出错的地方,但是,根本的问题还未能真正解决。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
更深入的明日再续。
相关文章推荐
- FileReader除了有函数readAsDataURL,另外还有另外两个函数readAsBinaryString 和 readAsText,分别可以将选择的文件读取成二进制和文本格式
- 从IXMLDOMDocument2中获取指定编码(如UTF-8)格式的数据
- 关于BinaryWriter或者BinaryReader中的编码和流字节序问题
- 关于MNIST数据格式和matlab读取问题
- 关于Mysql数据库longblob格式数据的插入com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V问题分析
- 关于Class MyBatisPagingItemReader<T> 读取数据只读第一条分页数据就结束了问题
- 以HttpGet方法获取URL数据并转换成指定编码格式的字符串
- 关于http接口开发中json格式数据编码问题处理
- C#根据指定url下载文件并读取.csv数据转为json格式
- 关于ASP中按指定编码写入读取文件
- C语言sscanf()函数:从字符串中读取指定格式的数据&&C语言strtok()函数:字符串分割
- Python编码格式导致的csv读取错误(csv.reader, pandas.csv_read)
- 关于Java语言的eclipse读取数据库,并将数据转换成JSON格式输出
- 总结关于iPhone中UIWEBVIEW读取本地GBK编码格式html
- 指定编码格式读写文件和读取文件夹下所有文件
- 总结关于iPhone中UIWEBVIEW读取本地GBK编码格式html
- 以HttpGet方法获取URL数据并转换成指定编码格式的字符串
- (好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- java读取Excel指定格式的数据
- C语言sscanf()函数:从字符串中读取指定格式的数据