zoukankan      html  css  js  c++  java
  • 抄也能抄出不一样的代码,我真是个人才

      最近要做一个文件下载的功能, 简单得不能再简单. 

    因为实在API接口中返回的, 外面被框架包了一层再返回, 我懒得研究框架,直接找到别的类似的功能, 抄了一下.

    由于没有源代码, 我就 只能用 反编译工具 ILSpy,简单把同事的dll反编译了一下,得到如下代码

            private static void Download(string fileName, DataTable data)
            {
                HttpContext.Current.Response.ContentType = "application/octet-stream";
                string str = HttpUtility.UrlEncode(Path.GetFileName(fileName)).Replace('+', ' ');
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;   filename=" + str);
                MemoryStream memoryStream = new MemoryStream();
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.BinaryWrite(ExcelHelper.Export(data, "").GetBuffer());
                HttpContext.Current.Response.End();
            }

    然后我大概看了一眼, 我就自己一边抄一边写,我写的是这样的

            /// <summary>
            /// xml文件下载
            /// </summary>
            /// <param name="fileName"></param>
            /// <param name="memoryStream"></param>
            private void Download(string fileName, MemoryStream memoryStream)
            {
                try
                {
    
                    HttpContext.Current.Response.ContentType = "application/octet-stream";
                    string str = HttpUtility.UrlEncode(System.IO.Path.GetFileName(fileName)).Replace('+', ' ');
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;   filename=" + str);
                    HttpContext.Current.Response.Clear();
                    // byte[] ubyte = System.Text.Encoding.UTF8.GetBytes(xmlStr);
                    HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
                    HttpContext.Current.Response.End();
                }
                catch
                {
    
                }
    
            }

    乍一看好像是没什么问题, 直到后来,我又要做一个导出的功能(别的项目模块)

    我一下子也不想去找我自己之前的那个代码, 心想, 还是去 抄 同事的代码 (反编译dll 我觉得是件很有趣的事情)

    我又反编译了一下同事的代码, 这次我仔细看了下,瞄到 一个 

     HttpContext.Current.Response.BinaryWrite(ExcelHelper.Export(data, "").GetBuffer());

    这行代码里面 用的是 MemoryStream 的GetBuffer() 方法, 我对这个方法好像没什么印象,然后我又把我之前的代码找出来
    我是这样写的 HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
    好家伙,我抄代码都能抄出不一样的东西来, 然后我就在 "垃圾堆" 里面搜索
    memoryStream.ToArray() 和 memoryStream.GetBuffer() 的区别,然后巴拉巴拉一大堆,
    大致意思就是说,
    memoryStream.ToArray() 是返回 memoryStream 的 复制品, 返回速度慢
    memoryStream.GetBuffer() 返回的是 memoryStream 的 内存引用,返回速度快,但是却把 很多没用到的 空数据做占用的地址空间也传递出来了 
    前半段我理解了, 后半段是个什么鬼?
    于是我决定试一下, 用 Notepad++ 打开, 发现后面 有这个 NUL

    这个 NUL 部分就是 占用的多于的空间地址的内容(导出的文件要消耗内存)


    对于我导出的这个文件, 大小在2kb到 10几kb之间, 好像也区别不大.我还是用我的 memoryStream.ToArray() .
    记下这个例子, 只是为了给自己提个醒,  "温故而知新",不可 "狂妄自大". 

    </ArrayOfSysParamInfo>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

  • 相关阅读:
    spring中bean的生命周期
    【数据结构与算法】2.2 数组实现循环队列思路、代码
    【数据结构与算法】2.1、数组队列场景、思路、实现
    【Java 基础领域】手气红包实现思路、代码
    【数据结构与算法】1、稀疏数组场景、思路、代码实现
    【Java基础领域】 byte num = 100 没有强制类型转换,为什么也可以编译通过
    【程序人生】程序员发展的7大方向
    【读书笔记】老许的架构
    对于开发中为什么很少用设计模式的思考
    Java编程思想目录
  • 原文地址:https://www.cnblogs.com/mjxxsc/p/14925813.html
Copyright © 2011-2022 走看看