从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (四)

news2025/1/9 15:25:20

      我是写Java的就用Java及所需要的基础来写的本篇文章,其他语言的讲解和应用暂时也不会,欢迎大佬在评论区指导,给出其他语言的讲解分析与应用

Java数据传输字符流和字节流

       java.io 是 Java 编程语言中的一个包,主要用于输入和输出(I/O)操作。它提供了一系列类和接口,用于处理各种类型的数据流(如字节流和字符流),以便在程序与外部世界(如文件、网络连接、内存等)之间进行数据交换。
        我对web(万维网)理解就是,将文件(数据)处理并且进行交换,在计算机中所有的都是01编码形成的,将01进行传输并且处理。就是把本地的流处理扩大到多个机器流处理。
在这里插入图片描述
                                          冯·诺依曼机器
       在 Java 中,输入输出操作可以通过两种主要的流类型来完成:字节流和字符流。它们各自有不同的用途和特点,适用于不同类型的数据处理。下面将详细讲解这两种流的概念、特征以及常用的类。

一、字节流(Byte Stream)

       字节流是以字节为单位进行数据传输的流,适用于处理原始二进制数据,如图片、音频、视频等。字节流的主要特点是:

  • 数据单位:以字节为单位(8 位)。
  • 适用场景:处理二进制文件(如音频、视频、图像等)和文本文件(通过字节形式读取和写入)。
  • 性能:通常在处理二进制数据时,字节流的性能较高。
常用的字节流类
  1. InputStream:所有字节输入流的超类。

    • FileInputStream:用于从文件中读取字节数据。
    • BufferedInputStream:提供缓冲功能,提高读取效率。
  2. OutputStream:所有字节输出流的超类。

    • FileOutputStream:用于向文件中写入字节数据。
    • BufferedOutputStream:提供缓冲功能,提高写入效率。
示例代码(字节流)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamExample {
    public static void main(String[] args) {
        // 写入字节到文件
        try (FileOutputStream fos = new FileOutputStream("example.dat")) {
            fos.write(65); // 写入字节(对应字符 'A' 的 ASCII 码)
            fos.write(66); // 写入字节(对应字符 'B' 的 ASCII 码)
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件读取字节
        try (FileInputStream fis = new FileInputStream("example.dat")) {
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data); // 将字节转换为字符并打印
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

二、字符流(Character Stream)

       字符流是以字符为单位进行数据传输的流,适用于处理文本数据,如文档、字符串等。字符流的主要特点是:

  • 数据单位:以字符为单位(通常是 16 位,使用 Unicode 编码)。
  • 适用场景:处理文本文件,支持多种字符编码(如 UTF-8、UTF-16 等)。
  • 自动处理字符编码:字符流能够自动将字节数据转换为对应的字符。
常用的字符流类
  1. Reader:所有字符输入流的超类。

    • FileReader:用于从文件中读取字符数据。
    • BufferedReader:提供缓冲功能,能够高效地读取字符数据,常与 InputStreamReader 配合使用。
  2. Writer:所有字符输出流的超类。

    • FileWriter:用于向文件中写入字符数据。
    • BufferedWriter:提供缓冲功能,能够高效地写入字符数据。
示例代码(字符流)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharStreamExample {
    public static void main(String[] args) {
        // 写入字符到文件
        try (FileWriter fw = new FileWriter("example.txt")) {
            fw.write("Hello, World!"); // 写入字符串
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件读取字符
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line); // 打印每一行
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、字节流与字符流的对比

特点字节流(Byte Stream)字符流(Character Stream)
数据单位字节(8 位)字符(16 位,Unicode 编码)
适用场景处理二进制数据,如图片、音频等处理文本数据,如文档、字符串
编码处理不支持编码转换自动处理字符编码
性能适合大文件的高速读写适合文本数据的处理

总结

  • 字节流 适用于处理二进制数据,能够有效读取和写入原始字节,适合于文件传输和图像、音频等非文本数据的处理。
  • 字符流 适用于处理文本数据,能够自动处理字符编码,适合于文本文件的读取和写入。用这个可以把文字处理,出错的概率比较低,字节流如果一个部分出现错位,有可能一片出错
    在这里插入图片描述
           我们传输的形式已经讲完了,怎么进行信息处理。

网页需求处理需求

       在网络编程中,我们面对的用户对象不会是单一的,我们需要在同一时间内去面对多个用户并行的处理操作。随着用户数量的增加和请求处理的复杂性,我们就要使用使用多线程、线程池化和线程复用等技术来提高处理的水平。回想一下操作系统中的部分,我们的服务器就是一个计算机他同样的是基于那四个特征(并发、共享、虚拟、不确定)。

1. 多线程

多线程是指在同一进程中同时运行多个线程。每个线程可以独立执行任务,多个线程可以并行处理多个请求。

  • 提高并发性:在网络应用中,服务器通常需要同时处理多个客户端请求。多线程允许服务器同时响应多个请求,从而提高系统的并发处理能力。
  • 降低响应时间:通过并行处理请求,多个客户端可以在几乎相同的时间内获得响应,降低了平均响应时间。
  • 分担负载:多线程可以将工作负载分散到多个线程上,防止单个线程因处理某个请求而阻塞。

2. 线程池化

线程池化是管理和复用一组线程的机制。在应用启动时,创建一定数量的线程并将其放入池中,客户端请求到达时,线程池会分配一个空闲线程来处理请求。

  • 减少开销:频繁创建和销毁线程会导致性能下降,线程池通过重用现有线程来减少这些开销,提高性能。
  • 资源管理:线程池允许开发者设定最大线程数,从而控制系统资源的使用,避免过多线程导致的系统崩溃或性能下降。
  • 提升响应速度:线程池中的线程可以立即处理请求,减少等待时间,相比每次请求都创建新线程,响应速度更快。

3. 线程复用

线程复用是指在处理完某个任务后,线程不会被销毁,而是返回到线程池中,准备处理下一个任务。线程池通过这种方式管理线程的生命周期。

  • 提高效率:线程复用避免了线程的频繁创建和销毁,节省了系统资源和时间。
  • 稳定性:通过复用线程,可以减少系统的负担和资源竞争,提升系统的稳定性和响应能力。
  • 灵活性:复用线程使得系统能够动态适应负载变化,可以根据实际需要灵活分配线程。

实际案例

例如,一个在线聊天应用需要同时处理成千上万的用户连接。在这种情况下:

  • 使用多线程可以确保每个用户的请求都能被及时处理。
  • 通过建立线程池来管理这些线程,避免创建过多的线程导致资源浪费。
  • 线程复用则可以确保在用户断开连接后,线程能够快速返回池中,等待处理其他用户的请求。

不同的视角学习这些东西是有差距的,之前我学习操作系统的时候看这些都是基于本地的,现在是web部分将多个计算机联系到一起还是会有不同的。网络的部分我们就需要用到socket和seversocket。(下篇预告)

  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (一)
  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (二)
  • 从理论到实践网络编程模型:(BIO、NIO、AIO)同步与异步模型的原理与应用 (三)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 和 Unix 的关系

Linux 和 Unix 的关系 2.2.1unix 是怎么来的 2.2.2Linux 是怎么来的 GNU计划的另一个目的是构建自由的软件文化,以支持以无条件自由软件和开放源码程序这种文化理念为核心的一整套系统,来推动软件在世界范围内的普及及发展。其中包括支持点(推…

java开发环境搭建基础之2----开发工具eclipse在windows的安装

一.背景 公司安排了带徒弟任务,写点基础的环境搭建这些吧。搭建基础开发环境,主要是jdk、eclipse、git、maven、mysql。后续再考虑编写jenkins、nexus、docker、1panel等CI/CD环境搭建。本次主要内容是eclipse的下载安装及运行。我的开发环境&#xff0c…

Linux内核(4)——Linux设备文件open函数从应用到内核全过程解析

学习并整理了下open等系统调用,从用户态如何调用到内核态的全过程。 1.Linux内核目录总览 2.Linux文件系统与设备驱动关系 这是在Linux设备驱动开发详解里找的两张图,内容很形象。 当用户程序通过系统调用陷入内核态时,会先经过VFS&#xf…

Hive3:表操作常用语句-内部表、外部表

一、内部表 1、基本介绍 (CREATE TABLE table_name ......) 未被external关键字修饰的即是内部表, 即普通表。 内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定(默认:/user/hive/ware…

多线程处理

1、使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include<myhead.h>struct Buf {int start;//起始位置int end;//结束位置const char *arr;//源文件const char *brr;//目标…

Spring-component-scan标签详解

<context:component-scan base-package"cn.ybzy.springtest"/> 首先&#xff0c;这标签是需要context的命名空间的。 base-package&#xff1a; 指定spring扫描注解的类所在的包。当需要扫描多个包的时候&#xff0c;可以使用逗号分隔。 如果只希望扫描特定…

Linux防火墙2

一、SNAT和DNAT SNAT&#xff1a;让内网机器可以访问外网服务器 DNAT: 让外网机器可以访问内网服务器 1.1、SNAT原理与应用 SNAT 应用环境 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)&#xff0c;私转公 SNAT原理:源地址转换&#xff0c;…

水平直逼高级病理学家!清华团队提出AI基础模型ROAM,实现胶质瘤精准诊断

胶质瘤是一种源自脑内神经胶质细胞的肿瘤&#xff0c;占据所有原发性中枢神经系统肿瘤的 40&#xff05;~60&#xff05;&#xff0c;并以成年人最常见的颅内原发性肿瘤而闻名。胶质瘤的组织病理分类非常复杂&#xff0c;通常分为三种亚型&#xff1a;星形细胞瘤、少突胶质细胞…

使用go的tls库搭建客户端服务器加密通信

文章目录 使用OpenSSL生成证书Win系统安装openssl生成证书 非HTTP 直接tcp通信服务器代码客户端代码通信效果 使用OpenSSL生成证书 Win系统安装openssl 安装地址 https://slproweb.com/products/Win32OpenSSL.html设置环境变量 cmd命令检验 openssl version 生成证书 生成C…

2024.7.28 记录一次悲惨的笔试——作业帮NLP校招

小红的奇偶抽取 题目描述 题解 #include <iostream> #include<stack> using namespace std;int main() {long long n;stack <int> ji, ou;cin >> n;while (n) {int a n % 10;if (a % 2 0)ou.push(a);elseji.push(a);n n / 10;}long long jN 0, o…

Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试

在微服务架构中&#xff0c;服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此&#xff0c;实现服务调用的重试机制显得尤为重要。Resilience4…

DDR3的使用(四)利用XILINX MIGIP核(native)读写DDR3—IP核信号分析

我们这一节继续结合仿真波形和逻辑分析仪测试波形来分析下MIGIP核的各个信号使用&#xff0c;这里主要说的是用户端的信号&#xff0c;这些信号直接与ip核进行交互&#xff0c;只有正确使用才能按我们的要求来读写数据。 1.我们先打开modelsim仿真软件&#xff0c;查看下examp…

机器学习笔记 - RAFT 光流简读

一、光流 光流是图像序列中像素的表观运动。为了估计光流,场景中物体的移动必须具有相应的亮度位移。这意味着一个图像中移动的红球在下一个图像中应该具有相同的亮度和颜色,这使我们能够确定它以像素为单位移动了多少。下图显示了光流示例,其中一系列图像捕获了逆时针旋转的…

使用 宝塔面板 部署 语料库php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…

一文全面了解高性能计算平台是什么、怎么选型?高性能计算平台CHPC 都能做什么?

一. 概述 随着技术的发展和数据量的爆炸性增长&#xff0c;企业面临的挑战日益复杂&#xff0c;对计算能力的需求也在不断增加。这些问题的解决超出了传统计算方法的能力范围&#xff0c;高性能计算&#xff08;HPC&#xff09;正是为解决这类问题而生。 高性能计算&#xff…

怎么锁定Word文档格式,保护文档完整性

在日常工作和学习中&#xff0c;我们经常会使用Word文档来编辑和保存重要信息。然而&#xff0c;在文档被多人编辑或分享的过程中&#xff0c;格式的意外变动往往会给后续工作带来不必要的麻烦。为了确保文档的格式在编辑和分享过程中保持不变&#xff0c;我们可以采取一些措施…

2024还有跨境玩家没解锁代理IP+设备多开模式的强大吗?

大多数跨境电商平台对于IP地址、浏览器环境等限制严格。若同一台电脑在同一个跨境电商平台注册多个账号&#xff0c;很容易被官方封禁。如何在不触发官方封禁机制的前提下&#xff0c;安全高效地开展多账号运营策略&#xff0c;成为了众多跨境电商从业者亟待解决的问题。本文将…

jenkins集成jmeter

jenkins 安装插件HTML Publisher startup trigger Groovy 脚本介绍 cd /app/jmeter rm -rf result.jtl jmeter.log report mkdir -p report sh /app/jmeter/apache-jmeter-5.6.3/bin/jmeter.sh -n -t test.jmx -l result.jtl -e -o ./report-n: 表示以非 GUI 模式运行 JMete…

堆的创建和说明

文章目录 目录 文章目录 前言 小堆&#xff1a; 大堆&#xff1a; 二、使用步骤 1.创建二叉树 2.修改为堆 3.向上调整 结果实现 总结 前言 我们已经知道了二叉树的样子&#xff0c;但是一般的二叉树是没有什么意义的&#xff0c;所以我们会使用一些特殊的二叉树来进行实现&a…