用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#