Java IO编程中的几个概念

Java中的IO编程实例 一、字节流和字符流有什么区别?输入流和输出流有什么区别?节点流和处理流的区别? 1、字符流和字节流是按照处理流的数据单位进行的划分 2、OutputStream、InputStream、Writer、Reader四个都是抽象类。 3、字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。 4、InputStreamReader,OutputStreamWriter(转换流)来关联,实际上是通过byte[]和String来关联的。 . 阅读详情

BIO NIO AIO

java中的BIO NIO AIO 是在不同java版本更新过程中依次引入的, 性能也越来越好.
这个3个IO分别指:

  • BIO:同步阻塞IO, 传统的java.io包.
  • NIO: new IO, 是一种同步非阻塞IO, java,nio包, java 1.4引入.
  • AIO: 异步非阻塞IO, 也称NIO2, 由java 1.7引入, 应用还不是特别广泛.

阻塞 非阻塞 同步 异步

一开始接触这几个概念会感觉有些困惑, 但抓住应用程序线程, 操作系统的线程以及内存的内核空间与用户空间这几个概念就好了.一个IO操作需要操作系统线程将数据准备好, 并将数据从内核空间复制到用户空间. 具体过程:首先一个IO请求由应用程序线程发起, 接着操作系统的线程会将数据在内存的内核空间将数据准备好, 然后再从内核空间拷贝至用户空间, 供应用程序的线程读取.

  1. 阻塞
    阻塞是指应用程序的线程在IO操作处阻塞, 而不能进行往下执行.
  2. 非阻塞
    非阻塞则是, 就算操作系统的线程还未将IO操作的数据准备好,应用程序的线程还能够继续汪下执行.
  3. 同步
    同步本身是指多个线程之间的同步. 在IO操作中是指应用程序的线程是指需要不断的去询问操作系统线程IO操作的数据是否准备好.
  4. 异步
    相对同步, 异步则是程序的线程不用不断询问操作系统的线程数据时候准备好, 而是一旦操作系统的线程将数据准备好准备好了, 操作系统的线程会主动通知应用程序的线程. 异步需要操作系统的内核线程给与更多的支持.

BIO NIO AIO的应用场景2

BIO NIO AIO都有自己的应用场景, BIO性能低下, 适合连接数量少, 连接小的场景;

  • BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中, JDK1.4以前的唯一选择,但程序简单易理解。

  • NIO 方式适用于连接数目多且连接比较短(轻操作) 的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯等。编程比较复杂, JDK1.4 开始支持。

  • AIO 方式使用于连接数目多且连接比较长 (重操作) 的架构, 比如相册服务器, 充分调用 0S 参与并发操作,编程比较复杂, JDK7 开始支持。

    AIO需要更加依赖操作系统的支持, 但Linux操作系统从2.6版本才开始支持AIO, 现在还不如windos的完善, 在高并发网络编程中依然以IO复用模式为主.

NIO解读

NIO是一种单线程的多路复用IO, 其通过selector选择器监听多个连接, 一旦有连接需要处理则往下执行依次处理这些连接请求, 处理完之后再此循环至selector处查看是否有请求需要处理, 整个过程为单线程, 涉及线程切换.

虽然NIO的selector也会阻塞线程, 但是其依然叫同步非阻塞原因在于它可以同时监听多个IO操作, 在一些IO操作数据还没准备好的时候, 可以去处理其它IO操作, 并不会被某一个IO操作阻塞, 因此称为非阻塞IO, 这也是它被称为多路复用的原因.
下面是一个简单的代码示例:

public class NIOServer extends Thread {

	public void run() {
	try (Selector selector = Selector.open(); // 创建Selector
	ServerSocketChannel serverSocket = ServerSocketChannel.open();) {  // 创建服务器socket
	serverSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 8888));// 绑定IP地址与端口
	serverSocket.configureBlocking(false);  // 将服务器socket设置为非阻塞
	
	serverSocket.register(selector, SelectionKey.OP_ACCEPT);  // 注册selector
	
	while (true) {
		selector.select();// 监测是否有连接
		
		Set<SelectionKey> selectedKeys = selector.selectedKeys();
		Iterator<SelectionKey> iter = selectedKeys.iterator();
		while (iter.hasNext()) {// 遍历处理连接
		SelectionKey key = iter.next();
		requestHandler((ServerSocketChannel) key.channel());
		iter.remove();
		}
	}
}

参考

  1. http://www.52im.net/thread-306-1-1.html
  2. https://www.bilibili.com/video/av76227904?p=4
  3. https://juejin.im/post/5bea1d2e51882523d3163657
  4. https://www.jianshu.com/p/2965fca6bb8f
Java高级编程——IO流 阅读详情

相关推荐

java IO 编程实例

import java.io.FileNotFoundException; import java.io.FileReader; public class TestFileReader { public static void main(String[] args) { int c = 0; FileReader freader = null; try { freader = new FileReader("d:/io/test.txt");//查看API 它的构造函数 int ln = 0; while((c=freader.read())!=-1){ System.out.println((char)c); } freader.close(); } catch (FileNotFoundException e) { System.out.println("找不到指定的文件"); }catch(Exception ee){ System.out.println("文件读取错误"); } } }

Java IO篇 Java IO编程

Java IO即Java 输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件、控制台、网络),我们还要考虑具体和它们的通信方式(顺序、随机、二进制、按字符、按字、按行等等)。Java类库的设计者通过设计大量的类来攻克这些难题,这些类就位于java.io包中。

凤文Sharing的博客 1906

如何利用GMS构建地下水数值模拟模型?

第一步:点图中三维网格的图标然后点Grid→Create Grid这个界面是用于创建一个有限差分网格的设置窗口。它允许你定义网格在三维空间中的范围、分辨率以及其他相关属性。这个界面提供了一个直观的方式来定义一个三维的有限差分网格,你需要指定每个维度上的范围、划分的单元格数量,以及一些控制单元格大小分布和网格方向的参数。这个网格通常会被用于数值模拟,例如地下水流模拟。在点击 "OK" 之前,请务必仔细检查所有参数是否符合你的建模需求。1. X-Dimension (X 轴维度)2. Y-Dimension (

weixin_44259522的博客 2094

JavaIO概述

一、Java IO(输入输出)介绍: 1、概念: IO是Input(输入)和Output(输出)的首字母缩写。 I(输入Input):指向Java程序中输入数据,即Java程序从外部获取数据。 O(输出Output):指的是Java程序向外部输出数据,即Java程序向外部发送数据。 流:在Java程序和外部之间,数据像水流一样按照顺序传输。Java中,流有两种形式,字节流和字符流,下文会讲解。 外部(也就是数据源)包括:源设备 和 目标设备。 源设备:Java程序使用Input(输入)获取数据的来源。 目标

Freer_von的博客 3037

(侧边抽屉)移动端APP汉堡页设计全解:从规范落地到体验优化

汉堡页是一种隐藏式侧边导航组件,由汉堡图标(三条水平横线)、侧边抽屉面板、主界面遮罩层三部分构成。点击汉堡图标后,面板通常从左侧滑入,覆盖主界面部分区域(或悬浮于主界面之上);关闭时可通过点击关闭按钮、遮罩层、返回键或侧滑手势完成,是移动端特有的空间优化设计模式。

qq_67370502的博客 617

【PINN高级教程】范式融合与前沿应用 第5讲:贝叶斯推断与生成式建模的深度融合

正规化流(Normalizing Flow, NF)通过一系列可逆变换把简单分布映射为复杂后验,从而获得更好的表达能力。算子学习保持映射的物理正确性。贝叶斯推断给出了自然的框架,但直接对高维函数空间做采样(如 MCMC)几乎不可行。1️⃣ 在自己的 PDE 上跑一遍完整的 Bayesian PINN 流模型。的学习机制深度融合,以在保持物理一致性的前提下,高效地从后验分布中采样。2️⃣ 将每个 θ 直接映射到 FNO 权重,得到不同解的采样。的后验 p(θ∣x,y)p(θ∣x,y) 进行近似。

u012133341的博客 474

【Java之IO操作全集】

Java IO操作一脉打通!

ypykip博客 566

【SpringBoot】1、创建第一个SpringBoot项目

创建SpringBoot项目可以通过两种方式,1、通过访问:https://start.spring.io/,SpringBoot的官方网站进行创建SpringBoot项目;2、通过工具(例如:Idea)创建SpringBoot项目。本次使用开发工具:Idea创建我的第一个SpringBoot项目。 首先,打开我们的Idea开发工具 选择Create New Poject(创建一个新的项目) ...

JACKAL 21万+

第八篇:Java I/O操作

有时候需要在序列化和反序列化过程中执行自定义操作。例如,可以通过实现和方法来控制序列化和反序列化的过程。java// 默认序列化// 自定义序列化// 默认反序列化// 自定义反序列化@OverridejavaJava的I/O操作提供了丰富的工具和类来处理数据的输入和输出,包括字节流和字符流、缓冲流和数据流,以及对象序列化。理解这些I/O操作的基本概念和API可以帮助你有效地处理文件和数据流,提高程序的效率和可维护性。输入和输出流。

HYP_Coder的博客 1873

【UE5】RTS游戏的框选功能+行军线效果实现

步骤: 一、项目准备; 二、框选NPC并移动到指定地点; 三、框选效果; 四、行军线效果

ChaoChao66666的博客 2379

保姆级教程!Python爬虫爬取知乎回答,保存为Markdown文件

本教程实现了知乎公开回答的完整爬取与Markdown保存,核心流程为「请求页面→解析作者/时间/正文/图片→下载图片→保存MD文件」,步骤清晰,代码可直接复用关键特性:支持合并/单文件两种保存模式、自动下载图片并引用、中文乱码防护、非法文件名过滤,满足日常整理知乎回答的需求新手友好:无需复杂配置,仅需修改知乎问题URL即可运行,全程无坑,5分钟内可看到运行结果灵活扩展:支持进阶优化(登录、分页、格式完善),可根据个人需求调整功能。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1232

Java高级编程都有哪些知识点

Java高级编程都有哪些知识点 作者:谁不重要         当我们面试的时候,可能经常会被问到一些Java基础知识,聊着聊着,有时就会进阶到哪些高级知识点了,比如 什么JVM虚拟机,Java高级编程。其实所谓的高级,都是相对而言的,原理知道以后,将来碰到了,也就记下了,下 面我来说说Java 有的那些高级知识点。        1、我们做练习代码时经常

℃江 2万+

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 548

Java_IO流 详解

Java_IO流详解

写代码的渣渣苏 720

Vue3 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站!

vue3,nuxt3,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue3西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,自定义播放器样式,截屏,监控视频,vue3使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程,

🏆 前端领域优质创作者 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 中的阻塞 IO 和非阻塞 IO

IO(输入输出)操作是一个基础而又关键的部分。在 Java 中,处理 IO 通常涉及到阻塞 IO 和非阻塞 IO 两种模式。本文将介绍这两种模式的概念、特点以及在 Java 编程中的应用场景与区别。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 5871

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java IO流的概念理解

1.Java Io流的概念,分类,类图。 1.1 Java Io流的概念     java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。通过流的形式允许java程序使用相同的方式来访问不同的输入/输出源。stram是从起源(source)到接收的(sink)的有序数据。 注:ja...

一亩三分地 3万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

20200404——java中的io编程

java中的io编程主要分为三大部分。 File,字节流,字符流 java IO 概述 常用概念 * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流,输出流。 * 流按操作类型分为两种: * 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 * 字符流 : 字符流只能操作...

寄蜉蝣于天地,渺沧海之一粟。 398

一段话讲懂java中的3种IO、网络编程

​ 服务器的读数据的方法不会一直在进程对应的内存中等待,而是过一段时间询问进程对应的内存是否有新的数据复制进来,如果没有等待操作系统内核把数据复制到进程区域的内存,它需要我们主动每隔一端时间进行对内存数据准备区进行询问,直到有一次我们问它,刚好它有数据了,我们的方法就可以返回具体的数据,没有也会方法也会立马返回,不会阻塞。​ 既然IO可以进行数据的输入输出操作,内存既可以是数据源也可以是数据接收方,那么这个时候如果是两台计算机,那么我们就可以实现两个计算机的内存的数据相互收发。

qq_64039411的博客 1333

Java中的IO

Java中的IO

m0_46359551的博客 1888

Java网络编程06 - IO详解

Java网络编程06 - IO详解

qq_43350524的博客 1225

java中的io

Java 的 IO(输入/输出)操作是处理数据流的关键部分,涉及到文件、网络等多种数据源。以下将深入探讨 Java IO 的不同类型、底层实现原理、使用场景以及性能优化策略。

weixin_44546670的博客 1022

java中io是什么_深入理解Java中的IO

深入理解Java中的IO转载自:http://blog.youkuaiyun.com/qq_25184739/article/details/51205186本文的目录视图如下:Java IO概要a.Java IO中常用的类b.Java流类的类结构图1.流的概念和作用2.Java IO所采用的模型 :3.IO流的分类4.Java IO流对象1.输入字节流InputStream2.输出字节流OutputStr...

weixin_34638282的博客 8684

Java中的IO流

在Java中,IO流是用于处理输入和输出的抽象概念。流可以看作是数据在程序和外部资源(如文件、网络连接、控制台等)之间的流动通道。输入流(InputStream):用于从外部资源读取数据到程序中。输出流(OutputStream):用于将程序中的数据写入到外部资源。Java中的IO流是处理输入输出的核心机制,掌握IO流的使用对于开发高效的Java应用程序至关重要。本文从基础概念到实际应用,详细介绍了字节流、字符流、缓冲流、数据流和对象流的使用方法。

xycxycooo的博客 1047

IO 的基本概念

io 是上面 是以流为基础进行数据的输入输出。通俗点说就是java通过数据流方式和外部进行通讯 I/O中数据的操作是通过流的方式,我们可以把数据流看成水流一样,他可以从一个源头端流入到另一个目的端,且水流不是一次全部到达,而且连续的流入目的端。I是指从外部设备的数据流流入java程序的流。o是指从java程序中把数据流输出到其他设备中的流 IO操作的2个步骤: 1、准备数据 2、把数据从内核中拷贝到程序进程 io的四种模型 首先先了解同步和阻塞的概念 阻塞与非阻塞 主要表现再一个IO操作的过程中,列入读

mycsdnhmk的博客 5176
上一篇: java强转与继承关系的加深理解:object[]的数组无法强转为String[]的数组
下一篇: maven dependency中provided和compile的区别
lbzz
博客等级 码龄7年 6粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值