.NET Core C#中InputStream/OutputStream等价实现及线程组织方案
.NET Core C# 中 Java InputStream/OutputStream 的等价实现及线程组织
Java InputStream/OutputStream 的 C# 等价实现
在Java中,InputStream和OutputStream是字节流读写的抽象基类,对应到.NET Core C#中,核心等价抽象类是**Stream**。
针对你给出的Socket场景:
Java代码示例:
Socket socket = new Socket(host, port); OutputStream out = socket.getOutputStream(); InputStream input = socket.getInputStream();
C#里TcpClient.GetStream()返回的**NetworkStream**是双向流,同时支持读、写操作,无需分别获取输入、输出流(你的思路里重复获取两次是多余的),正确写法如下:
var client = new TcpClient(host, port); NetworkStream stream = client.GetStream(); // 同一个stream既可以执行写操作(对应Java的OutputStream),也可以执行读操作(对应Java的InputStream)
通用字节流场景的对应关系:
- 对应
InputStream:所有继承自Stream的可读流,比如FileStream(文件读)、MemoryStream(内存读)等 - 对应
OutputStream:所有继承自Stream的可写流,上述FileStream、MemoryStream等同样支持写操作
类似Java的线程组织方式
Java中通常会启动独立线程分别处理读、写逻辑,C#中可以用Thread类模拟传统线程写法,也可以用更符合.NET生态的异步任务(Task)实现。
用Thread类模拟Java线程写法
var client = new TcpClient(host, port); var stream = client.GetStream(); // 读线程 var readThread = new Thread(() => { byte[] buffer = new byte[1024]; int bytesRead; try { while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) { // 处理读取到的字节数据 Console.WriteLine($"读取到 {bytesRead} 字节"); } } catch (IOException ex) { // 处理连接断开等异常 Console.WriteLine("读操作异常:" + ex.Message); } }); // 写线程 var writeThread = new Thread(() => { byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello from C#"); try { stream.Write(data, 0, data.Length); // 如需持续写数据,可在此添加循环逻辑 } catch (IOException ex) { Console.WriteLine("写操作异常:" + ex.Message); } }); // 启动线程 readThread.Start(); writeThread.Start();
推荐的异步写法(Task/async-await)
.NET Core更推荐异步编程模型,避免阻塞线程,写法如下:
var client = new TcpClient(host, port); var stream = client.GetStream(); // 异步读任务 async Task ReadFromStreamAsync() { byte[] buffer = new byte[1024]; int bytesRead; try { while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) { // 处理读取的数据 Console.WriteLine($"读取到 {bytesRead} 字节"); } } catch (IOException ex) { Console.WriteLine("读操作异常:" + ex.Message); } } // 异步写任务 async Task WriteToStreamAsync() { byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello from C# async"); try { await stream.WriteAsync(data, 0, data.Length); // 如需持续写数据,可在此添加循环逻辑 } catch (IOException ex) { Console.WriteLine("写操作异常:" + ex.Message); } } // 启动异步任务 _ = ReadFromStreamAsync(); _ = WriteToStreamAsync();
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

