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();