File.ReadAllBytes操作文件和FileStream有啥区别

巴士上的邂逅 2018-01-10 10:14:07
看到别人的代码总是用FileStream操作文件,例如
FileStream fs = File.OpenRead(file);
var buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
而我觉得,一行足以
var buffer = File.ReadAllBytes(file);

请问,用FileStream操作文件有啥好处吗


突然发现发个技术贴最低需要50分了,并且都是50倍数了
...全文
2734 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
巴士上的邂逅 2018-07-14
  • 打赏
  • 举报
回复
和jdk1.9有什么关系

引用 8 楼 qq_36760582 的回复:
jdk1.9 有了新的实现
qq_36760582 2018-07-13
  • 打赏
  • 举报
回复
jdk1.9 有了新的实现
  • 打赏
  • 举报
回复
嗯,上面只是举一个例子。这里的 using 可能跟迭代器并不应该放在一起。 重新写这样一个例子:
public static byte[] ReadFile(string file)
{
    var result = new MemoryStream();
    var fs = File.OpenRead(file);
    var buffer = new byte[1024 * 8];
    var len = 0;
    while ((len = fs.Read(buffer, 0, buffer.Length)) > 0)
        result.Write(buffer, 0, len);
    return result.ToArray();
}
  • 打赏
  • 举报
回复
通常可以直接设置一个“自认为大小比较合适的”Buffer,避免一次声明很大的buffer,例如
public static IEnumerable<byte[]> ReadFile(string file)
{
    using (var fs = File.OpenRead(file))
    {
        var buffer = new byte[1024 * 20];
        var len = 0;
        while ((len = fs.Read(buffer, 0, buffer.Length)) > 0)
        {
            var result = new byte[len];
            buffer.CopyTo(result, len);
            yield return result;
        }
    }
}
这样使用迭代器机制来实现,就可以支持 IEnumerable 循环枚举。
  • 打赏
  • 举报
回复
你贴的第一个段代码是个 bug,如果用这个来招聘测试,可以判断应聘者是个“半吊子技术人员”,有许多基础知识不牢固。 代码
fs.Read(buffer, 0, buffer.Length);
这是错误的,这个方法返回了一个 int 整数,来说明 fs.Read 方法实际读取的字节数量,它完全有可能小于 buffer.Length。所以你看人家 InternalReadAllBytes 方法里边有一个 while 循环语句,这才是正确的编程。 所以你如果问你贴出的两个代码有什么本质区别,最本质地其实是,第一段是基础不好的程序员写出的有可能出 bug 的代码。第一段连正确定都不能保证,咱们就不管它是不是跟 InternalReadAllBytes 一样的功能了!
全栈极简 2018-01-10
  • 打赏
  • 举报
回复
ReadAllBytes是对FileStream的封装,
[System.Security.SecurityCritical]
        [ResourceExposure(ResourceScope.Machine)]
        [ResourceConsumption(ResourceScope.Machine)]
        private static byte[] InternalReadAllBytes(String path, bool checkHost)
        {
            byte[] bytes;
            using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 
                FileStream.DefaultBufferSize, FileOptions.None, Path.GetFileName(path), false, false, checkHost)) {
                // Do a blocking read
                int index = 0;
                long fileLength = fs.Length;
                if (fileLength > Int32.MaxValue)
                    throw new IOException(Environment.GetResourceString("IO.IO_FileTooLong2GB"));
                int count = (int) fileLength;
                bytes = new byte[count];
                while(count > 0) {
                    int n = fs.Read(bytes, index, count);
                    if (n == 0)
                        __Error.EndOfFile();
                    index += n;
                    count -= n;
                }
            }
            return bytes;
        }
https://referencesource.microsoft.com/#mscorlib/system/io/file.cs,4b24188ee62795aa
  • 打赏
  • 举报
回复
FileStream可以指定读多少byte,ReadAllBytes就是字面意思,一次性全读取出来了
Anonymous477 2018-01-10
  • 打赏
  • 举报
回复
并没有区别。。。其实是FileStream的封装。。。

exception92 2018-01-10
  • 打赏
  • 举报
回复
Read(buffer, 0, buffer.Length); -》流可以通过第二参数进行数据寻址,根据指定的开始位置读取固定长度的流数据。其它的就是楼上说的。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧