c#数据流输出
2017-03-22 20:25:27 qq_36545099 阅读数 459

C#数据流

  C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻。System.IO下的Stream类是所有数据流的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据流。C#数据流主要分为三类:FileStream、MemoryStream、NetworkStream,还有常用的StreamReader、StreamWriter和TextWriter类等。

  1.FileStream(文件流),继承Stream类。由名字可以看到这个类主要是对文件进行操作的。得到FileStream对象的常用方式有如下两种:

    FileStream fs=new FileStream(string path,FileMode mode,FileAccess access);//利用构造函数创建,FileMode枚举和FileAccess枚举这里就不总结了。

    FileStream fs=File.OpenWrite(@"C:\");//还有File.Open、File.OpenRead、File.OpenText都用的很多。

    得到FileStream对象后,调用常见的Read和Write方法即可进行读写,如果要读写比1kb字节大的文件时可以加个while循环来获得数据。

    //写文件流
    string str = "hh";
    byte[] bytes1 = new byte[1024];
    bytes1 = Encoding.UTF8.GetBytes(str);
    FileStream fst = new FileStream("sd", FileMode.OpenOrCreate, FileAccess.Write);
    fst.Write(bytes1, 0, bytes1.Length);
    //读文件流
    FileStream fs = File.OpenRead("sd");
    byte[] bytes2 = new byte[1024];
    int num = fs.Read(bytes2, 0, bytes2.Length);

  2.MemoryStream,内存流,它是以内存流的形式对内存中的字节数组进行操作,支持对数据流的查找和随机访问,和文件流一样可以使用Position属性得到内存流的当前位置。内存流的优点是对长度不定的数据进行缓存时,由于内存流是可以自动增长的,因此使用很方便。

    byte[] bytes=Encoding.UTF8.GetBytes("hh");
    using(MemoryStream ms=new MemoryStream())
    {
      ms.Write(bytes, 0, bytes.Length);
      byte[] byte2 = new byte[bytes.Length];
      ms.Position = 0;
      int n = ms.Read(byte2, 0, byte2.Length);
    }

  3.NetworkStream,网络流,这个流在网络编程里使用非常普遍。当客户端程序与服务器程序进行通信时数据的接受与发送就要用到这个类,有一点要特别注意,NetworkStream类仅仅只支持面向连接的套接字,比如使用TcpClient编写聊天程序时,只有服务器与客户端的TcpClient进行了连接后才能使用NetworkStream。得到NetworkStream对象创建好后就可以利用网络流对象进行网络数据的传递,但是网络流对象是没有Position对象的,无法指定起始位置来进行读写。还有NetworkStream对象的CanSeek属性始终返回false,使用Position和Seek方法会出现异常。

  得到NetworkStream对象有2种方式,一种是利用socket对象获得,一种是利用TcpClient对象来获得,后者我用的非常多。

    //写入数据到缓冲流

    NetworkStream ns=new NetworkStream(socket);

    NetworkStream ns=tcpClient.GetStream();

    if(ns.CanWrite)

    {

      byte[] bytes=Encoding.UTF8.GetBytes("hh");

      ns.Write(bytes,0,bytes.Length);

    }

    //读取数据
    if (ns.CanRead)
    {
      int num;
      byte[] bytes = new byte[1024];
      while (ns.DataAvailable)
      {
        num = ns.Read(bytes, 0, bytes.Length); 
      }
    }

  很明显,在实际编程中如果使用字节数组来接受或发送数据太麻烦了,后来从网络编程老师那学到了两个非常好用的类BinaryReader类和BinaryWriter类。我们在实际通信中使用最多的还是字符串通信,只要得到NetworkStream对象后,就可以得到字符串读取流和写入流,比如以下代码

    TcpClient tcp = new TcpClient();
    NetworkStream networkStream = new NetworkStream();
    BinaryReader reader;
    BinaryWriter writer;
    string msg = "hh";
    networkStream = tcp.GetStream();
    writer = new BinaryWriter(networkStream);
    writer.Write(msg);//写字符串
    string str=reader.ReadString();//读字符串

  还有StreamReader类和StreamWriter类用的也是比较多,比如读一个txt文档读到末尾,可以调用StreamReader对象的ReadToEnd方法来拿到这个txt的所有字符串内容。另外如果要对发送的数据进行加密的话,有一个CryptoStream类用起来也挺方便的,在创建这个对象时可以直接就指定采用的对称加密算法,比如DES加密算法。解密时也非常方便,只需要使用和加密时相同的密钥创建CryptoStream实例,并在创建实例时指定CryptoStreamMode为读模式,即可拿到解密后的数据。

 文章转自:http://www.cnblogs.com/fangyz/p/5122546.html

2018-02-08 09:52:19 weixin_41715295 阅读数 104

http://www.cnblogs.com/fangyz/p/5122546.html

C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻。System.IO下的Stream类是所有数据流的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据流。C#数据流主要分为三类:FileStream、MemoryStream、NetworkStream,还有常用的StreamReader、StreamWriter和TextWriter类等。

  1.FileStream(文件流),继承Stream类。由名字可以看到这个类主要是对文件进行操作的。得到FileStream对象的常用方式有如下两种:

    FileStream fs=new FileStream(string path,FileMode mode,FileAccess access);//利用构造函数创建,FileMode枚举和FileAccess枚举这里就不总结了。

    FileStream fs=File.OpenWrite(@"C:\");//还有File.Open、File.OpenRead、File.OpenText都用的很多。

    得到FileStream对象后,调用常见的Read和Write方法即可进行读写,如果要读写比1kb字节大的文件时可以加个while循环来获得数据。

    //写文件流
    string str = "hh";
    byte[] bytes1 = new byte[1024];
    bytes1 = Encoding.UTF8.GetBytes(str);
    FileStream fst = new FileStream("sd", FileMode.OpenOrCreate, FileAccess.Write);
    fst.Write(bytes1, 0, bytes1.Length);
    //读文件流
    FileStream fs = File.OpenRead("sd");
    byte[] bytes2 = new byte[1024];
    int num = fs.Read(bytes2, 0, bytes2.Length);

  2.MemoryStream,内存流,它是以内存流的形式对内存中的字节数组进行操作,支持对数据流的查找和随机访问,和文件流一样可以使用Position属性得到内存流的当前位置。内存流的优点是对长度不定的数据进行缓存时,由于内存流是可以自动增长的,因此使用很方便。

    byte[] bytes=Encoding.UTF8.GetBytes("hh");
    using(MemoryStream ms=new MemoryStream())
    {
      ms.Write(bytes, 0, bytes.Length);
      byte[] byte2 = new byte[bytes.Length];
      ms.Position = 0;
      int n = ms.Read(byte2, 0, byte2.Length);
    }

  3.NetworkStream,网络流,这个流在网络编程里使用非常普遍。当客户端程序与服务器程序进行通信时数据的接受与发送就要用到这个类,有一点要特别注意,NetworkStream类仅仅只支持面向连接的套接字,比如使用TcpClient编写聊天程序时,只有服务器与客户端的TcpClient进行了连接后才能使用NetworkStream。得到NetworkStream对象创建好后就可以利用网络流对象进行网络数据的传递,但是网络流对象是没有Position对象的,无法指定起始位置来进行读写。还有NetworkStream对象的CanSeek属性始终返回false,使用Position和Seek方法会出现异常。

  得到NetworkStream对象有2种方式,一种是利用socket对象获得,一种是利用TcpClient对象来获得,后者我用的非常多。

    //写入数据到缓冲流

    NetworkStream ns=new NetworkStream(socket);

    NetworkStream ns=tcpClient.GetStream();

    if(ns.CanWrite)

    {

      byte[] bytes=Encoding.UTF8.GetBytes("hh");

      ns.Write(bytes,0,bytes.Length);

    }

    //读取数据
    if (ns.CanRead)
    {
      int num;
      byte[] bytes = new byte[1024];
      while (ns.DataAvailable)
      {
        num = ns.Read(bytes, 0, bytes.Length); 
      }
    }

  很明显,在实际编程中如果使用字节数组来接受或发送数据太麻烦了,后来从网络编程老师那学到了两个非常好用的类BinaryReader类和BinaryWriter类。我们在实际通信中使用最多的还是字符串通信,只要得到NetworkStream对象后,就可以得到字符串读取流和写入流,比如以下代码

    TcpClient tcp = new TcpClient();
    NetworkStream networkStream = new NetworkStream();
    BinaryReader reader;
    BinaryWriter writer;
    string msg = "hh";
    networkStream = tcp.GetStream();
    writer = new BinaryWriter(networkStream);
    writer.Write(msg);//写字符串
    string str=reader.ReadString();//读字符串

  还有StreamReader类和StreamWriter类用的也是比较多,比如读一个txt文档读到末尾,可以调用StreamReader对象的ReadToEnd方法来拿到这个txt的所有字符串内容。另外如果要对发送的数据进行加密的话,有一个CryptoStream类用起来也挺方便的,在创建这个对象时可以直接就指定采用的对称加密算法,比如DES加密算法。解密时也非常方便,只需要使用和加密时相同的密钥创建CryptoStream实例,并在创建实例时指定CryptoStreamMode为读模式,即可拿到解密后的数据。


2018-10-05 10:13:16 kenjianqi1647 阅读数 195

一、前言

1、C# 通过数据流来执行I/O操作。

I/O数据流技术包括:文件操作、文件夹操作(目录操作)、I/O流

 

文件操作:使用File类、FileInto类  实现对文件的基本操作,如判断是否存在 、创建、移动、复制、删除、获取信息等。

文件夹操作:使用Directory类、DirectoryInfo类实现对文件夹的操作、如判断是否存在、创建、移动、删除、遍历等。

I/O操作:读写文件

2、  数据流基本概念

当希望通过网络传输数据,或对文件数据进行操作时,首先需要将数据化成数据流。数据流是对串行传输数据的一种抽象表示。

System.IO下的Stream类是所有数据流的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据流。C#数据流主要分为三类:FileStream、MemoryStream、NetworkStream,还有常用的StreamReader、StreamWriter和TextWriter类等。

二、文件操作

1、FIie类

File类支持对文件的基本操作,包括提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象,由于所有的File类的方法都是静态的,所以如果只进行一个操作,那么使用File方法的效率比使用File方法的效率高。

知识补充:

静态方法:C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。

(1)static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用! 
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类! 
(2)静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 
(3)静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存. 
(4)C#中的方法有两种:实例方法,静态方法.

静态方法销毁:主进程销毁时,内存中分配的静态方法销毁

2、FileInfo类

FileInfo类与FIie类之间的许多方法的调用都是相同的,但是FileInfo类没有静态方法,该类中的方法仅可以用于实例化对象。

3、使用方法

(1)判断文件是否存在

方一:

File.Exists("C:\\Test.txt");//判读C盘目录下是否存在Test.txt类

方二:

FileInfo finfo = new FileInfo("C:\\Test.txt");//创建文件对象
if(finfo.Exists)  //判断文件是否存在
{
}

三、流

流:程序开发中将输入与输出设备之间的数据传递抽象为流。

(1)不同分类方式:

字节流:操作的数据单元是一个字节。

字符流:操作的数据单元是两个字节或一个字符,因为一个字符占用两个字节。

以内存的角度出发:

输入流:数据从数据源(文件、压缩包、视频等)流入内存的过程。

输出流:数据从内存流出到数据源的过程。

c#中最重要的是FileStream类,它提供了读取和写入文件的方式。

1、FileStream 文件流

    文件流是字节序列的抽象概念,序列化用于将对象的状态存储到文件中。  FileStream类主要用于读写磁盘文件。常用于向磁盘存储数据或读取配置文件。

(1)创建FileStream实例

FileStream fs=new FileStream(string path,FileMode mode,FileAccess access);//文件所在的流程、文件创建的方式、文件的访问权限设置

FileInfo类创建FileStream对象的方法

FileStream fs=File.OpenWrite(@"C:\\File1.txt");//以只写的方式打开C盘目录下的File1.txt
FileStream fs=File.OpenRead(@"C:\\File1.txt");//以只读的方式打开C盘目录下的File1.txt

 (2)流操作文本文件

使用I/O流操作文本文件时主要用到StreamWriter类和StreamReader类。

StreamWriter类:

可以向文本文件中写入字符串,同时负责重要的准换以及处理向FileStream对象写入的工作。

saveFileDialog1.Filter = "文本文件(*.txt)|*.txt";//设置文件保存格式
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{
    StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,true);
    sw.WriteLine(textBox1.Text);//向创建的文件中写入流
    sw.Close();//关闭当前写入流
}

StreamReader类:

用来读取文本文档的类。

用法:

  private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "文本文件(*.txt)|*.txt";//设置文件的打开格式
            openFileDialog1.ShowDialog();
            textBox1.Text = openFileDialog1.FileName;
            //此处有Bug,因为Windows系统自己创建的记事本文件编码格式为ANSI,而下面读取时用了UTF8编码
            //改正该程序,需要将UTF8编码换成默认编码即可,将Encoding.UTF8替换为Encoding.Default
            StreamReader SReader = new StreamReader(textBox1.Text, Encoding.UTF8);
            textBox2.Text = SReader.ReadToEnd();//将整个流或从流的当前位置到流的结尾作为字符串的读取
        }

2、网络流

NetWorkStream类是专门用来处理服务器与客户端通信的流。它在网络编程中经常使用,主要是用来处理类似Socket、TcpClient和TcpListener这些类中得到的流。C#在System.Net.Sockets命名空间中提供了NetworkStream类用于收发网络数据 。

3、内存流

      MemoryStream类主要用于操作内存中的数据。比如说网络中传输数据时可以用流的形式,当我们收到这些流数据时就可以声明MemoryStream类来存储并且处理它们。

参考:https://www.cnblogs.com/mazhenyu/p/9139321.html

2011-06-17 11:13:00 oyf421102 阅读数 869

网络流

NetworkStream类提供用于网络访问的基础数据流,NetworkStream实现了通过网络套接字发送和接收数据的标准。NetworkStream支持对网络数据流的同步和异步访问,但不支持对网络数据流的随机访问。

Read

     NetworkStream newStream = new NetworkStream(mysock);

     byte[] myByte = new Byte[1024];

     newStream.Read(myByte,0,myByte.Length);

     newStream.Flush();

Write

     NetworkStream newStream = new NetworkStream(mysock);

byte[] myByte = new Byte[1024];

     newStream.Write(myByte,0,myByte.Length);

     newStream.Flush();

文本流

      文本流用于文本的读写。

向文件写文本流

      StreamWriter sw = null;

      sw = new StreamWriter(“e://temp//aa.txt”,false,System.Text.Encoding.UTF8);

      sw.Write(“aaaaaaaaaaaaaaaaaaaaaa”);

      sw.Close();

    新建或打开(如果不存在,就新建一个文件,如果已经存在,则打开)一个文件,然后向文件写文本数据,并且新数据代替旧数据。

StreamWriter sw = null;

      sw = new StreamWriter(“e://temp//aa.txt”,true,System.Text.Encoding.UTF8);

      sw.Write(“aaaaaaaaaaaaaaaaaaaaaa”);

      sw.Close();

    新建或打开(如果不存在,就新建一个文件,如果已经存在,则打开)一个文件,然后向文件写文本数据,并且新数据放在旧数据后面。

向网络写入文本

      string str = “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”;

      byte[] myByte = System.Text.Encoding.UTF8.GetBytes(str);

      NetworkStream netStream = new NetworkStream(mysock);

      netStream.Write(myByte,0,myByte.Length);

从文件读取文本

      StreamReader sr = null;

      sr = new StreamReader(“e:/temp//aa.txt”,System.Text.Encoding.UTF8);

      string myStr = sr.ReadToEnd();

      sr.Close();

从网络读取文本

      string str = “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”;

      byte[] myByte = System.Text.Encoding.UTF8.GetBytes(str);

      NetworkStream netStream = new NetworkStream(mysock);

      netStream.Read(myByte,0,myByte.Length);

文件流

    文件流主要用于读写非文本的文件。文件类型可以是各种各样的。无论是文本文件,还是图片文件、压缩文件、可执行文件等等吗,都可以用文件流实现读写功能。

将网络流数据写入文件

下面代码演示如何从网络流中读取数据并将内容写入文件,其中path代表文件路径,stream代表已经连接并且存在数据传输的网络流。

FileStream filestream = new FileStream(path

,FileMode.OpenOrCreate,FileAccess.Write);

int readNumber = 0 ;

byte[] bye = new byte[8];

while((readNumber = stream.Read(bye,0,8)) > 0 )

{

    filestream.Write(bye,0,readNumber);

    filestream.flush();

}

fileStream.Close();

读文件并写入网络流

filestream = new FileStram(path,

FileMode.Open,FileAccess.Read);

int number;

byte[] bb = new byte[8];

NetworkStream stream = new NetworkStream(newClient);

while((number = filestream.Readbb,0,8)) != 0)

{

    stream.Write(bb,0,8);

    stream.Flush();

    bb = new byte[8];

}

Filestream.Close();

2015-08-21 08:50:38 jiayawei90 阅读数 313
public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";


        var files = context.Request.Files[0];


        int x = (int)Convert.ToDouble(context.Request["name"].Split(',')[0].Split(':')[1]);
        int y = (int)Convert.ToDouble(context.Request["name"].Split(',')[1].Split(':')[1]);
        int w = (int)Convert.ToDouble(context.Request["name"].Split(',')[2].Split(':')[1]);
        int h = (int)Convert.ToDouble(context.Request["name"].Split(',')[3].Split(':')[1]);


        Stream sm = files.InputStream;
        byte[] bt = new byte[sm.Length];
        sm.Read(bt, 0, files.ContentLength);




        System.Drawing.Image bm = System.Drawing.Image.FromStream(CropImageFile(bt, x, y, w, h), true);
        bm.Save(context.Request.PhysicalApplicationPath + "upload\\" + files.FileName);
        bm.Dispose();
        
        




        context.Response.Write("Hello World");
    }


    //裁剪
    protected MemoryStream CropImageFile(byte[] imageFile, int targetX, int targetY, int targetW, int targetH)
    {
        MemoryStream imgMemoryStream = new MemoryStream();
        System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(new MemoryStream(imageFile));


        Bitmap bmPhoto = new Bitmap(targetW, targetH, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        bmPhoto.SetResolution(72, 72);


        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;


        try
        {
            grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), targetX, targetY, targetW, targetH, GraphicsUnit.Pixel);
            bmPhoto.Save(imgMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            imgPhoto.Dispose();
            bmPhoto.Dispose();
            grPhoto.Dispose();
        }
        return imgMemoryStream;
    }

C#文件与数据流

阅读数 323

staticvoidfunc1(){     //利用File类判断指定目录中是否包含指定的文件      stringfilepath="e:\\FileText\\Text.txt";      if(File.Exists(filepath)){        Console.WriteLine("文件存在!");

博文 来自: Su_wu

C#中数据流

阅读数 138

概念:流用于对IO的处理,在system.IO的命名空间下有以下一些类:1.BinaryReader/BinaryWriter  用特定的编码将基元数据类型读作二进制值/将二进制中的基元类型写入流并支持用特定的编码写入字符串2.TextReader/Writer   表示可读取有序字符系列的读取器。/表示可以编写一个有序字符系列的编写器(1)StreamReader/Strea...

博文 来自: qq_27032631

C# Xml 数据流

阅读数 454

FileStreamstream=newFileStream("c://个人信息.xml",FileMode.Open);//声明xml变量XmlDataDocumentdoc=newXmlDataDocument();//将xml读取到dataset中doc.DataSet.ReadXml(newStreamReader(stream));//将数据绑定到GridView1if(d

博文 来自: HanYanBin

C# FileStream数据流

阅读数 2168

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.IO;namespaceFileStream类{classProgram{staticvoi

博文 来自: Godsight

C# 数据流基础 - 创建自定义的数据流块

阅读数 32

usingSystem.Threading.Tasks;usingSystem.Net.Http;usingSystem;usingSystem.Linq;usingSystem.Collections.Generic;usingSystem.Threading.Tasks.Dataflow;namespacetask{classProgram...

博文 来自: u010081392
没有更多推荐了,返回首页