12.C# Stream

Stream

System.IO 命名空间 | Microsoft Learn

Stream 流,字节序列

提供灵活且高效的方式来处理数据的输入和输出

字节数组

字符串->字节数组

var data = Encoding.Default.GetBytes("abcdefghijklmnopqrstuvwxyz");

随机生成字节数组

var data = new byte[1024];
new Random().NextBytes(data);

字节数组->字符串

byte[] data = [0x41, 0x42, 0x43];
String str = Encoding.Default.GetString(data);

16 进制显示

String byte2Hex(byte[] data)
{
    var buffer = new StringBuilder();
    for (int i = 0; i < data.Length; i++)
    {
        buffer.Append(String.Format("{0:X2}", data[i]).ToUpper());
        buffer.Append((i + 1) % 16 == 0 ? "\n" : " ");
    }
    return buffer.ToString();
}

不同编码

var data = Encoding.UTF8.GetBytes("你好");

C# 默认带 UTF-8 编码,不支持 GB2312 需要安装编码库。

dotnet add package System.Text.Encoding.CodePages
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var data = Encoding.GetEncoding("GB2312").GetBytes("你好");

Stream

Stream

提供字节序列的泛型视图。 是一个抽象类。

BufferedStream

添加缓冲层以在另一个流上读取和写入操作

文件流

文件对话框

<DockPanel Margin="10"> 
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
        <Button Click="Button_Click" Width="96" Height="36" Margin="0, 0, 0, 10">Open File</Button>
    </StackPanel>
    <TextBox Name="textBox"
            TextWrapping="Wrap"
            AcceptsReturn="True"
            VerticalScrollBarVisibility="Auto"/>
</DockPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
	...
}
OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = "请选择文件";
dialog.Filter = "所有类型的文件|*.*|文本文件 (*.txt)|*.txt";
dialog.FileName = string.Empty;
dialog.FilterIndex = 1;
dialog.Multiselect = false;
dialog.RestoreDirectory = false;
dialog.CheckFileExists = true;
if (dialog.ShowDialog().Value)
{
	String FilePath = Path.GetFullPath(dialog.FileName);
	MessageBox.Show(FilePath);
}

读文件

StreamReader

using (StreamReader sr = new StreamReader(@"D:\test.txt"))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

FileStream

FileStream fileStream = File.Open(@"D:\test.txt", FileMode.Open);
byte[] array = new byte[fileStream.Length];
fileStream.Read(array, 0, array.Length);
fileStream.Close(); 
Console.WriteLine(Encoding.Default.GetString(array));

写文件

SaveFileDialog dialog = new SaveFileDialog();
dialog.Title = "请选择文件";
dialog.Filter = "所有类型的文件|*.*|文本文件 (*.txt)|*.txt";
dialog.FileName = "new-file.txt";
if (dialog.ShowDialog().Value)
{
	String FilePath = Path.GetFullPath(dialog.FileName);
	MessageBox.Show(FilePath);
}

StreamWriter

DirectoryInfo[] cDirs = new DirectoryInfo(@"D:\").GetDirectories();
using (StreamWriter sw = new StreamWriter("CDriveDirs.txt"))
{
    foreach (DirectoryInfo dir in cDirs)
    {
        sw.WriteLine(dir.Name);
    }
}

FileStream

FileStream fileStream = File.Open(@"D:\test.txt",FileMode.Append)
byte[] array = Encoding.Default.GetBytes("Hello Stream")
fileStream.Write(array, 0, array.Length); 
fileStream.Close(); 

网络流

服务端

TcpListener listener=new TcpListener(5000); //服务器监听
listener.Start();//启动
Socket sock=listener.AcceptSocket();//阻塞,直到有客户端连接

NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable)   //如果客户端发送了消息
{
   byte[] data = new byte[1024];   //定义一个字节数组,用来存放接收的数据
   int len = netStream.Read(data, 0, data.Length);  //从位置开始,读取到字节数组末尾
   string line = Encoding.Default.GetString(data, 0, len);  //把收到的字节转换为字符串
}

客户端

TcpClient client = new TcpClient();//客户端tcp对象
client.Connect("127.0.0.1", 5000);//连接服务器
NetworkStream myStream = client.GetStream();//得到网络流
                
byte[] data = Encoding.Default.GetBytes("Hi,你好");  //首先把输入的字符串消息转换为字节
myStream .Write(data, 0, data.Length);  //向myStream 里写入数据
myStream .Flush();  //刷新流中的数据
myStream .Close();

内存流

string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串

输入输出流

输入流

StreamReader reader = new StreamReader(@"D:\test.txt",Encoding.Default);//初始化读取 设置编码格式,否则中文会乱码
string readStr = reader.ReadLine();//从流中读取一行  reader.ReadToEnd()读取全部
reader.Close();//关闭流

输出流

StreamWriter writer = new StreamWriter(@"D:\test1.txt");//初始化写入
writer.WriteLine("Hi 你好123");//写入一行
writer.Close();

C# 中,`Stream` 类代表了一种可以进行输入输出操作的二进制数据源或目标。`Write` 和 `Read` 方法是 `Stream` 类的基础方法,用于向流中写入数据和从流中读取数据。 **Stream.Write()方法:** `Write()` 方法用于将数据写入到流中。其基本语法如下: ```csharp public void Write(byte[] buffer, int offset, int count) ``` - `buffer`: 要写入的数据缓冲区。 - `offset`: 开始写入的缓冲区偏移量。 - `count`: 需要写入的字节数。 例如,你可以创建一个文件流,然后写入字符串到其中: ```csharp FileStream file = new FileStream("output.txt", FileMode.Create); byte[] bytes = Encoding.UTF8.GetBytes("Hello, World!"); file.Write(bytes, 0, bytes.Length); file.Close(); // 关闭流 ``` **Stream.Read()方法:** `Read()` 方法则是从流中读取数据,其基本语法如下: ```csharp public int Read(byte[] buffer, int offset, int count) ``` - `buffer`: 存储读取数据的缓冲区。 - `offset`: 数据开始存储的位置。 - `count`: 预期要读取的字节数。 例如,从文件流中读取数据: ```csharp FileStream file = File.OpenRead("input.txt"); int bytesRead; byte[] readBuffer = new byte[1024]; while ((bytesRead = file.Read(readBuffer, 0, readBuffer.Length)) > 0) { // 处理读取的数据... } file.Close(); // 关闭流 ``` 这两个方法常用于处理网络传输(如通过 TCP/IP 的 Socket)、文件操作以及其他类型的二进制数据交换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值