如何在C#中将FileStream.ReadByte()返回的int转换为byte?
解决C#中FileStream.ReadByte()转byte的溢出问题
嘿,这个问题我之前也踩过坑!先给你解释下为什么会抛出异常:FileStream.ReadByte()返回int类型可不是随便设计的——它的返回值范围是0-255(对应有效的字节值)或者-1(表示已经读到文件末尾)。当你直接用Convert.ToByte()去转-1的时候,因为byte是无符号的0-255类型,-1超出了它的范围,自然就会报错啦。
下面给你两种靠谱的解决方案:
方案一:逐字节读取(处理单字节场景)
先判断返回的int值是不是-1,确认不是文件末尾后,再强制转换为byte(这时候值一定在0-255之间,完全安全):
// 记得指定FileMode,原代码缺少这个参数哦 using (FileStream fStream = new FileStream(filePath, FileMode.Open)) { int readIntValue; while ((readIntValue = fStream.ReadByte()) != -1) { byte readByte = (byte)readIntValue; byteBuffer[index] = readByte; index++; // 别忘了移动缓冲区索引,不然会一直覆盖同一个位置 // 如果缓冲区满了,这里可以加入发送字节流的逻辑,然后重置index } }
⚠️ 一定要用using语句包裹FileStream,这样能确保文件流被正确释放,避免资源泄漏。
方案二:批量读取(更高效的场景)
如果你的需求是读取整个文件并发送字节流,逐字节读效率很低,推荐用批量读取的方式:
方法A:直接读取整个文件到字节数组
byte[] fileBytes = File.ReadAllBytes(filePath); // 拿到数组后直接发送即可,或者复制到你的byteBuffer里
这种方式最简单,适合文件不大的场景。
方法B:用FileStream.Read批量填充缓冲区
using (FileStream fStream = new FileStream(filePath, FileMode.Open)) { int bytesRead; // 每次读取尽可能多的字节到byteBuffer,从index位置开始,最多读剩余的缓冲区空间 while ((bytesRead = fStream.Read(byteBuffer, index, byteBuffer.Length - index)) > 0) { index += bytesRead; // 这里可以加入发送当前缓冲区数据的逻辑 // 发送完成后重置index为0,继续填充下一批数据 if (index == byteBuffer.Length) { // Send byteBuffer... index = 0; } } // 处理最后一批不足缓冲区大小的数据 if (index > 0) { // Send the remaining bytes in byteBuffer... } }
批量读取能大幅提升IO效率,尤其是处理大文件的时候。
总结一下:核心就是先判断ReadByte()的返回值是否为-1,再进行转换;如果不是必须逐字节处理,优先用批量读取的方式哦!
周末愉快呀,希望这个解决方法能帮到你😉
内容的提问来源于stack exchange,提问作者EggBender
相关产品推荐
相关产品推荐

