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

      我是写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。(下篇预告)

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值