Java的IO之BIO

news2024/11/15 8:08:54

Java IO流是用于处理输入和输出的机制,用于读取和写入数据。Java提供了丰富的IO类和接口,用于处理不同类型的数据和操作。Java中的IO模型主要分为BIO和NIO两种,他们可以分别被视为IO编程的不同风格或模式,并非IO流具体的类型,主要为BIO,NIO和AIO(NIO的升级版)。这篇我们主要围绕BIO进行,介绍BIO的相关使用和案例。

BIO

是传统的阻塞式IO模型,基于流的概念,使用阻塞的方式进行IO操作,在BIO模型中,当一个线程执行IO操作的时候,会被阻塞,直到数据准备好或者操作完成,这意味着一个线程只能处理一个IO操作,如果有多个IO操作需要处理,就需要创建多个线程,这样就导致资源的方法和性能下降。

BIO的相关特点:

  • 阻塞等待:当没有数据可读取时,BIO模型会阻塞线程,直到有数据可读取。同样,当无法写入数据时,BIO模型会阻塞线程,直到有空闲的写入缓冲区。

  • 同步阻塞:BIO模型是同步阻塞的,即一个线程只能处理一个IO操作。如果有多个IO操作需要处理,就需要创建多个线程,这可能导致资源浪费和性能下降。

  • 适用于连接数较少:由于每个IO操作都需要一个独立的线程来处理,BIO模型适用于连接数较少的场景。当连接数增加时,线程数量也会增加,可能导致系统资源消耗过大。

由于BIO会阻塞进程,故而其不适用于高并发场景,即便可以使用线程池进行相关优化,但是他还会消耗线程资源,与此同时,在百万级别的并发场景下也撑不住。

BIO的类型

IO流中具有很多种类型,我们这里重点围绕字符流和字节流进行。每种类型都有输入流和输出流的概念,用于处理不同类型的数据。

字节流:
在这里插入图片描述

  • InputStream:字节输入流的抽象基类,用于从数据源读取字节。
  • OutputStream:字节输出流的抽象基类,用于向目标写入字节。
  • FileInputStream:文件字节输入流,用于从文件中读取字节。
  • FileOutputStream:文件字节输出流,用于向文件中写入字节。
  • ByteArrayInputStream:字节数组输入流,用于从内存中读取字节。
  • ByteArrayOutputStream:字节数组输出流,用于向内存中写入字节。

字符流:
在这里插入图片描述

  • Reader:字符输入流的抽象基类,用于从数据源读取字符。
  • Writer:字符输出流的抽象基类,用于向目标写入字符。
  • FileReader:文件字符输入流,用于从文件中读取字符。
  • FileWriter:文件字符输出流,用于向文件中写入字符。
  • StringReader:字符串字符输入流,用于从字符串中读取字符。
  • StringWriter:字符串字符输出流,用于向字符串中写入字符。

除了字节流和字符流,还有一些其他类型的IO流,如对象流、缓冲流、数据流等,它们提供了更高级的功能和特定的数据处理方式。

JavaIO流的相关概念和常用类

字节流和字符流:

  • 字节流:以字节为单位进行读写操作,适用于处理二进制数据。常见的字节流类有InputStreamOutputStream
  • 字符流:以字符为单位进行读写操作,适用于处理文本数据。常见的字符流类有ReaderWriter

节点流和处理流:

  • 节点流:直接与数据源或目标进行交互,如文件、网络连接等。常见的节点流类有FileInputStreamFileOutputStreamFileReaderFileWriter
  • 处理流:对节点流进行包装,提供额外的功能,如缓冲、压缩、加密等。常见的处理流类有BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter

输入流和输出流:

  • 输入流:用于从数据源读取数据的流。常见的输入流类有InputStreamReader
  • 输出流:用于向目标写入数据的流。常见的输出流类有OutputStreamWriter

常用IO类:

  • File:用于操作文件和目录。
  • ByteArrayInputStreamByteArrayOutputStream:用于在内存中读写字节数组。
  • StringReaderStringWriter:用于在内存中读写字符串。
  • ObjectInputStreamObjectOutputStream:用于读写Java对象。

示例:

import java.io.*;

public class IOExample {
    public static void main(String[] args) {
        try {
            // 创建输入流
            FileInputStream fis = new FileInputStream("input.txt");
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader br = new BufferedReader(isr);

            // 创建输出流
            FileOutputStream fos = new FileOutputStream("output.txt");
            OutputStreamWriter osw = new OutputStreamWriter(fos);
            BufferedWriter bw = new BufferedWriter(osw);

            // 读取输入流并写入输出流
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
            }

            // 关闭流
            br.close();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们使用了字符流和缓冲流来读取一个文本文件的内容,并将内容写入另一个文本文件。首先,我们创建了输入流和输出流的实例,然后使用缓冲流逐行读取输入流的内容,并将内容写入输出流。最后,我们关闭流以释放资源。

案例2

我们在利用BIO模型和JavaSocket创建一个服务器和客户端进行交互的案例。

服务端代码:

public class BIOServerExample {
    public static void main(String[] args) {
        try {
            // 创建ServerSocket并监听端口
            ServerSocket serverSocket = new ServerSocket(8082);
            System.out.println("服务启动,监听到端口号为:"+ serverSocket.getLocalPort());

            while (true) {
                // 等待客户端连接
                Socket socket = serverSocket.accept();
                System.out.println("客户端链接成功: " + socket.getInetAddress());

                // 创建输入流和输出流
                InputStream inputStream = socket.getInputStream();
                OutputStream outputStream = socket.getOutputStream();

                // 读取客户端发送的数据
                byte[] buffer = new byte[1024];
                int length = inputStream.read(buffer);
                String request = new String(buffer, 0, length);
                System.out.println("接受请求: " + request);

                // 处理请求并发送响应
                String response = "Hello, " + request;
                outputStream.write(response.getBytes());

                // 关闭连接
                socket.close();
                System.out.println("客户端断开链接.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

public class BIOClientExample {
    public static void main(String[] args) {
        try {
            // 创建Socket并连接服务器
            Socket socket = new Socket("localhost", 8082);
            System.out.println("链接去服务: " + socket.getInetAddress());

            // 创建输入流和输出流
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();

            // 发送请求
            String request = "World";
            outputStream.write(request.getBytes());

            // 接收响应
            byte[] buffer = new byte[1024];
            int length = inputStream.read(buffer);
            String response = new String(buffer, 0, length);
            System.out.println("接收响应: " + response);

            // 关闭连接
            socket.close();
            System.out.println("从服务器断开链接.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

云计算2主从数据库

设置主从数据库的目的是将数据库1和数据库2分别建在两个虚拟机上,并实现数据互通访问 首先准备两个虚拟机,这里示例ip分别为: 192.168.200.10;192.168.200.20 修改主机名,一个是mysql1,一个是mysql2&#x…

除了Confluence,还有哪些好用的知识库平台

大家都知道,Confluence作为知识库平台界的佼佼者,确实给我们带来了不少便利。但好东西总是层出不穷,除了Confluence,市面上还有其他好用的知识库平台也值得我们去尝试。今天,我就给大家聊聊我个人用过并且觉得挺不错的…

Vue+Element UI 开发PC端页面,出现页面抖动原因及解决办法

问题描述: 页面 拖动 放大放小,出现页面抖动,屏幕不停闪动 解决方案: 1.找到相对应的页面的div 加上样式: .app-container {height: 100%;overflow: auto;margin: 0; //加上这个把滚动条隐藏掉,否则就…

PHP页面如何实现设置独立访问密码

PHP网页如果需要查看信息必须输入密码,验证后才可显示出内容的代码如何实现? 对某些php页面设置单独的访问密码,如果密码不正确则无法查看内容,相当于对页面进行了一个加密。 如何实现这个效果,详细教程可以参考:PHP页面如何实现…

香港科技大学(广州)先进材料学域可持续能源与环境学域智能制造学域博士招生宣讲会——北京专场(暨全额奖学金政策)

三个学域代表教授亲临现场,面对面答疑解惑助攻申请!可带简历现场咨询和面试! 💰一经录取,享全额奖学金1.5万/月! 报名链接: https://www.wjx.top/vm/wF2Mant.aspx# 地点:中关村皇冠…

【免费】如何考取《鲸鸿动能广告初级优化师》认证(详细教程)

鲸鸿动能广告初级优化师认证考试PC网址 初级:鲸鸿动能广告初级优化师认证-华为开发者学堂 (huawei.com) 注:免费认证,里面包含免费的课程,浏览器用Edge。 文章目录 鲸鸿动能广告初级优化师认证考试网址 前言 一、备考流程 二…

C++ Qt开发:QProcess进程管理模块

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess组件实现针对进程的控制管理…

“找不到msvcr100.dll”或“msvcr100.dll丢失”的多种解决方法分享

当计算机系统中msvcr100.dll文件发生丢失时,导致某些应用程序无法正常运行。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows操作系统的应用程序正常运行至关重要。小编将介绍5种解决msvcr100.dll丢失问题的方法…

由于找不到vcruntime140.dll无法继续执行

如果你发现在Windows操作系统中缺少vcruntime140.dll文件,可能会对你打开某些应用程序或媒体文件造成困扰。在本文中,我们将介绍vcruntime140.dll是什么及其作用,以及缺失该文件时可能会遇到的问题。同时,我们还将探讨解决此问题的…

低代码开发平台开源:依靠科技力量实现数字化转型!

在竞争激烈的当今社会,数字化转型、流程化办公等字眼早已充斥在我们的职场生活中。虽然如此,但是我们依然要面临着这样一个现实问题:很多中小企业发展面临着资源有限、技术储备不足、人才短缺的现实问题,进入流程化办公困境依然明…

huggingface的transformers训练gpt

目录 1.原理 2.安装 3.运行 ​编辑 4.数据集 ​编辑 4.代码 4.1 model init​编辑 forward: 总结: 关于loss和因果语言模型: ​编辑 交叉熵:​编辑 记录一下transformers库训练gpt的过程。 transformers/examples/…

【每日一问】IOS手机上Charles证书过期怎么办?

1、如何查看证书是否过期? 设置>通用>VPN与设备管理 2、在Charles中重置证书 步骤1:重置证书 Help>SSL Proxying>Reset Charles Root Certificate… 步骤2:在浏览器中,下载证书 首先,手机连上代理,然…

【前端】多个标签省略效果

简言 多个标签省略效果实现 标签省略 有的时候我们想实现省略标签多余的标签&#xff0c;且不显示省略的内容。 有个简单快速的实现方法&#xff1a; 将标签用span元素实现&#xff0c;block元素文本省略可以包含span子元素。 示例 <!DOCTYPE html> <html lang&…

【笔记】Python学习记录

Python学习记录 Hello World变量简单数据类型字符串大小写转换插入变量Tab和Enter删除前后空格删除前后缀 Hello World 老调调了&#xff0c;如何在终端输出信息呢&#xff1f; print("Hello World")Hello World变量 变量命名遵从代码变量命名通则&#xff0c;几乎…

绿色节能|AIRIOT智慧建材能耗管理解决方案

建材供应是建筑业不可或缺的一个重要环节&#xff0c;在环保和企业可持续发展的双重需求下&#xff0c;建材生产商对建材生产过程中的能耗掌握和能耗管理尤其关注。但在实际生产和运营过程中&#xff0c;传统的建材能耗管理方式往往存在如下痛点&#xff1a; 用户管理权限不完善…

【MySQL】存储过程、存储函数、触发器

目录 存储过程介绍技术背景存储过程的作用与优势存储过程跟自定义函数很像。它们的区别是&#xff1a; 存储过程的缺点存储过程的特性基本存储过程使用1.创建语法语法说明&#xff1a;使用案例1.创建获取新闻类别数量的存储过程2.创建获取指定新闻类别ID下新闻数量的存储过程 2…

面向对象的三大特性-----封装、继承、多态(Java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

安科瑞ADL逆流检测多功能电表

ADL400 导轨式多功能电能表&#xff0c;是主要针对电力系统&#xff0c;工矿企业&#xff0c;公用设施的电能统计、管理需求而设计的一款智能仪表&#xff0c;产品具有精度高、体积小、安装方便等优点。集成常见电力参数测量及电能计量及考核管理&#xff0c;提供上48月的各类电…

使用appuploder上架App Store流程

使用appuploder流程笔记 1.如何没有账号去apple官网注册一个&#xff0c;地址&#xff1a;https://developer.apple.com/account 2.下载解压appuploder&#xff0c;双击打开&#xff0c;用刚刚注册的账号登录&#xff0c;下载地址&#xff1a;http://www.applicationloader.n…

实战 | 云服务器accessKey泄露实战利用

通过信息收集发现子域为xx.xx.com网站&#xff0c;打开先找功能点&#xff0c;测试登录&#xff0c;是微信扫描登录&#xff0c;自己太菜&#xff0c;测试一圈没测出来什么 指纹识别发现是js开发&#xff0c;如果登录或者找回密码不是扫码登录的话&#xff0c;八成是前端验证&a…