当前位置:编程学习 > C#/ASP.NET >>

用FileStream类实现读取大二进制文件的问题

创建一个windows应用程序,打开一个标准的OpenFileDialog(),选择要打开的二进制文件,文件大小没有做限制。在读取二进制文件的时候,可以在多行文本框中逐个显示文件中的每个字节,每行输出显示16个字节,并以16进制格式输出,其中使用StringBuider类来构造每一文本行。现在的问题是,例如当我打开的一个4M大小的二进制文件,在RichTextBox中输出显示的非常慢。大约花了30秒钟,有什么好的办法可以让读取并显示这样4M的二进制文件速度加快呢,麻烦解答。如果需要代码我就贴出来。(这是C#高级编程这本书的例子) --------------------编程问答-------------------- 4M相当大了  块不到哪去了 --------------------编程问答-------------------- 没讲清楚。问题不在 FileStream,而在你怎样和 RichTextBox 交互。

用 Profiler 测一下就知道问题在那一步。通常是因为有很多的重新分布,拷贝,做成了 O(N^2) 的算法。 --------------------编程问答--------------------    System.Diagnostics.Stopwatch sw = new Stopwatch();
                sw.Stop();
                Console.WriteLine("导入时间" + sw.ElapsedMilliseconds.ToString());
中间写代码 

                sw.Reset();
                sw.Start();
                sw.Stop();
                Console.WriteLine("显示时间" + sw.ElapsedMilliseconds.ToString());


看看各处的时间   到底 哪块慢了
--------------------编程问答-------------------- FileStream不会慢到这个鸟样的!

你最好贴代码出来看一看! --------------------编程问答-------------------- 4M啊,lz弄懂了一定要把代码发出来,分就不要了

帮你顶 --------------------编程问答--------------------

using System;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace BinaryFileReader
{
    public partial class Form1 : Form
    {
        private readonly OpenFileDialog chooseOpenFileDialog = new OpenFileDialog();  //文件对话框
        private string chosenFile;        //当前文件路径                                 

       //处理菜单和文件对话框的程序
        public Form1()
        {
            InitializeComponent();

            menuFileOpen.Click += OnFileOpen; 
                
            chooseOpenFileDialog.FileOk +=OnOpenFileDialogOK;
        }

        private void OnFileOpen(object Sender, EventArgs e)
        {
            chooseOpenFileDialog.ShowDialog();
        }

        private void OnOpenFileDialogOK(object Sender, CancelEventArgs e)
        {
            chosenFile = chooseOpenFileDialog.FileName;
            Text = Path.GetFileName(chosenFile);//从其获取文件名和扩展名的路径字符串。 
            DisplayFile();
        }
        //读取选中的文件并显示;
        private void DisplayFile()
        {
            int nCols = 16;
            FileStream inStream = new FileStream(chosenFile, FileMode.Open,FileAccess.Read);//实例化FileStream
            long nBytesToRead = inStream.Length;  //确定文件有多少个字节;
            //if (nBytesToRead > 65536 / 4)   
            //    nBytesToRead = 65536 / 4;
            int nLines = (int)(nBytesToRead / nCols) ;//计算总共显示多少行;
            string[] lines = new string[nLines];
            int nBytesRead = 0;//读取的字节数
            for (int i = 0; i < nLines; i++)
            {
                StringBuilder nextLine = new StringBuilder();//构造每一文本行
                //nextLine.Capacity = 4 * nCols;
                for (int j = 0; j < nCols; j++)
                {
                    int nextByte = inStream.ReadByte();
                    nBytesRead++;
                    //if (nextByte < 0 || nBytesRead > 65536)
                    //    break;
                    char nextChar = (char)nextByte;//强制转换为字符
                   
                    if (nextChar < 16)  //值小于16的字符的显示方法
                        nextLine.Append(" x0" + string.Format("{0,1:X}", (int)nextChar));
                    //else if
                    //    (char.IsLetterOrDigit(nextChar) || char.IsPunctuation(nextChar))
                    //    nextLine.Append("  " + nextChar + "  ");
                    else
                        nextLine.Append(" x" + string.Format("{0,2:X}", (int)nextChar));
                                                            
                }
                lines[i] = nextLine.ToString();
            }
            inStream.Close();
            //textBoxContents.Lines = lines;
            richTextBox1.Lines = lines;
        }

     }
} --------------------编程问答-------------------- 以上就是这个程序的代码,我打开100多K的文件速度还可以,当达到M以上速度就慢了很多,最终要读取4M的文件。前面有个大哥说的方法,我试试。请大家发表自己的看法,我不胜感激。 --------------------编程问答-------------------- 怎么还没有人回帖啊,等待高手答案
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,