我是写Java的就用Java及所需要的基础来写的本篇文章,其他语言的讲解和应用暂时也不会,欢迎大佬在评论区指导,给出其他语言的讲解分析与应用
Java数据传输字符流和字节流
java.io 是 Java 编程语言中的一个包,主要用于输入和输出(I/O)操作。它提供了一系列类和接口,用于处理各种类型的数据流(如字节流和字符流),以便在程序与外部世界(如文件、网络连接、内存等)之间进行数据交换。
我对web(万维网)理解就是,将文件(数据)处理并且进行交换,在计算机中所有的都是01编码形成的,将01进行传输并且处理。就是把本地的流处理扩大到多个机器流处理。
冯·诺依曼机器
在 Java 中,输入输出操作可以通过两种主要的流类型来完成:字节流和字符流。它们各自有不同的用途和特点,适用于不同类型的数据处理。下面将详细讲解这两种流的概念、特征以及常用的类。
一、字节流(Byte Stream)
字节流是以字节为单位进行数据传输的流,适用于处理原始二进制数据,如图片、音频、视频等。字节流的主要特点是:
- 数据单位:以字节为单位(8 位)。
- 适用场景:处理二进制文件(如音频、视频、图像等)和文本文件(通过字节形式读取和写入)。
- 性能:通常在处理二进制数据时,字节流的性能较高。
常用的字节流类
-
InputStream:所有字节输入流的超类。
- FileInputStream:用于从文件中读取字节数据。
- BufferedInputStream:提供缓冲功能,提高读取效率。
-
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 等)。
- 自动处理字符编码:字符流能够自动将字节数据转换为对应的字符。
常用的字符流类
-
Reader:所有字符输入流的超类。
- FileReader:用于从文件中读取字符数据。
- BufferedReader:提供缓冲功能,能够高效地读取字符数据,常与
InputStreamReader
配合使用。
-
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)同步与异步模型的原理与应用 (三)