java网络io_彻底搞懂Java的网络IO

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同步、阻塞的方式,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞。

java.io包的好处是代码比较简单、直观,缺点则是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。

java.net下面提供的部分网络API,比如Socket、ServerSocket、HttpURLConnection 也时常被归类到同步阻塞IO类库,因为网络通信同样是IO行为。

在Java 1.4中引入了NIO框架(java.nio 包),提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用IO程序,同时提供更接近操作系统底层的高性能数据操作方式。

在Java7中,NIO有了进一步的改进,也就是NIO2,引入了异步非阻塞IO方式,也被称为AIO(Asynchronous IO),异步IO操作基于事件和回调机制。

基本概念

在学习Java的IO流之前,需要了解同步异步、阻塞非阻塞的基本概念。

同步与异步

同步和异步是针对应用程序和内核的交互而言的。

同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。例如:自己上街买衣服,自己亲自干这件事,别的事干不了。

异步指的是用户进程触发IO操作以后便开始做其他的事情,而当IO操作已经完成的时候会得到IO完成的通知。例如:告诉朋友自己合适衣服的尺寸、颜色、款式,委托朋友去买,然后自己可以去干别的事。同时,你还需要告诉朋友你家衣柜在哪,方便朋友买完之后,直接将衣服放到你的衣柜。(使用异步I/O时,Java将I/O读写委托给OS处理,需要将数据缓冲区地址和大小传给OS)。

阻塞与非阻塞

阻塞和非阻塞是针对进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式。

阻塞指的是当试图对该文件描述符进行读写时,如果当时没有东西可读,或暂时不可写,程序就进入等待状态,直到有东西可读或可写为止。去地铁站充值,发现这个时候充值员碰巧不在,然后我们就在原地等待,一直等到充值员回来为止。

非阻塞指的是如果没有东西可读,或不可写,读写函数马上返回,而不会等待。在银行里办业务时,领取一张小票,之后我们可以玩手机,或与别人聊聊天,当轮到我们时,银行的喇叭会通知,这时候我们就可以去办业务了。

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

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

相关文章

1. 在虚拟机中 添加内容

步骤: 1. 找到要添加的内容,按住 ctrl c 复制 ,例如:复制 飞秋 2. 打开 虚拟机,找到 要复制文件的位置。 3. 将 复制的文件添加到 共享文件夹下面。 4. 打开虚拟机,安装飞秋 5, 最后就完成了…

JavaScript设计模式-10.工厂模式实例xhr

1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title>Javascript高级语法10-工厂模式实例xhr</title>6 </head>7 <body>8 <script>9 //接口…

java web scala_spring boot+scala编写web接口

本人是Java开发者&#xff0c;有面向对象的基础&#xff0c;而Scala也是面向对象的语言&#xff0c;学习后可快速入门。通过学习Scala的面向对象(和java面向对象类似)、Scala的高级函数(map,reduce等&#xff0c;和Java8中的stream编程类似)、Scala的隐式转换(在Java中可通过sp…

java对象引用出错_上传图片错误:尝试在空对象引用上调用虚拟方法’java.lang.String android.net.Uri.getLastPathSegment()’...

我有“用相机捕获图像”的问题,并将其存储到Firebase中.我认为该代码是正确的,因为它可以与“从图库中选择图像”一起使用.捕获完图像后,该应用程序停止了,并且没有存储在数据库中.我认为这对于android M和N是个问题.我只是看到其他类似的问题,但它们对我不起作用.我为此寻求帮…

数组的运用

一、数组的概念以及定义&#xff1a; 1、 数组是存储同一种数据类型多个元素的集合&#xff0c;也可以看作是一个容器。 2、数组既可以存储基本数据类型&#xff0c;也可以存储引用数据类型。 二、一维数组&#xff1a; 1、一维数组的定义&#xff1a; 数据类型 [ ] 数组名 ne…

java小应用_java小应用

第一次使用简书记笔记&#xff0c;主要目的是为了加深印象&#xff0c;方便忘记时及时翻看。hello.java代码如下&#xff1a;import java.applet.Applet;import java.awt.*;public class hello extends Applet{private Font f1;public void init(){f1 new Font("宋体&quo…

POJ 2288 Islands and Bridges(状压dp)

http://poj.org/problem?id2288 题意&#xff1a; 有n个岛屿&#xff0c;每个岛屿有一个权值V&#xff0c;一条哈密顿路径C1&#xff0c;C2&#xff0c;...Cn的值为3部分之和&#xff1a; 第1部分&#xff0c;将路径中每个岛屿的权值累加起来&#xff1b;第2部分&#xff0c;对…

java做橡皮擦效果_HTML5 canvas橡皮擦擦拭效果

这是一款HTML5 canvas橡皮擦擦拭效果。该效果通过canvas来制作遮罩层和擦拭用的橡皮擦&#xff0c;用户可以通过移动鼠标来移除遮罩层&#xff0c;效果非常炫酷。因为发代码有时会排版混乱&#xff0c;所以先发图演示了。源码已经打包好了&#xff0c;想学习的朋友可以下载练习…

web前端开发面试题(答案)

1.xhtml和html有什么区别&#xff1f; HTML是一种基本的WEB网页设计语言&#xff0c;XHTML是一个基于XML的置标语言最主要的不同&#xff1a;XHTML 元素必须被正确地嵌套。XHTML 元素必须被关闭。标签名必须用小写字母。XHTML 文档必须拥有根元素。 2.行内元素有哪些?块级元素…

mysql to mssql_MysqlToMsSql

MysqlToMsSql是一款简单易用的数据库迁移工具&#xff0c;这款软件功能强大&#xff0c;可以帮助用户将MySQL数据库内容转移到msSQL数据库中&#xff0c;采用可视化操作&#xff0c;支持预览&#xff0c;方便用户查看数据库&#xff0c;实用性强&#xff0c;有需要的用户快来下…

java延迟覆盖_高效Java第九条覆盖equals时总要覆盖hashCode

原标题&#xff1a;高效Java第九条覆盖equals时总要覆盖hashCode高效Java第九条覆盖equals时总要覆盖hashCode在每个覆盖了equals方法的类中&#xff0c;也必须覆盖hashCode方法。否则会导致该类无法与基于散列的集合一起正常运作。 hashCode约定在应用程序的执行期间&#xff…

原生js简单实现双向数据绑定原理

根据对象的访问器属性去监听对象属性的变化&#xff0c;访问器属性不能直接在对象中设置&#xff0c;而必须通过 defineProperty() 方法单独定义。 访问器属性的"值"比较特殊&#xff0c;读取或设置访问器属性的值&#xff0c;实际上是调用其内部特性&#xff1a;get…

Flyweight Design Pattern 共享元设计模式

就是利用一个类来完毕多种任务&#xff0c;不用每次都创建一个新类。 个人认为这个设计模式在C里面。好像能够就使用一个函数取代&#xff0c;利用重复调用这个函数完毕任务和重复利用这个类&#xff0c;好像差点儿相同。 只是既然是一个设计模式&#xff0c;那么就使用类来完毕…

java中write方法报错_Java中管道报错:Write end dead

今天看了下关于管道的通信&#xff0c;Java中的管道只能在同一进程的不同线程间通信。今天测试两个线程进行通信发现报错。下面是我测试的代码。package com.wpl.testIO;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;public …

Linux课堂笔记-第二天

Shell简介 在Linux系统中&#xff0c;shell是最常用程序&#xff0c;作用侦听用户命令&#xff0c;启动命令所指定的进程并将结果返回给用户。他还是一种程序设计语言&#xff0c;是系统维护时的重要工具。 两部分组成&#xff0c;#为命令行提示符&#xff1b;#为超级用户&…

java多属性的map_java - 具有多个参数的MapStruct QualifiedByName - 堆栈内存溢出

目前&#xff0c;MapStruct不支持具有多个源属性的映射方法。但是&#xff0c;在您的情况下&#xff0c;您可以使用1.2.0中的Context 。 根据我的理解&#xff0c; projId和code就像映射的帮助器一样&#xff0c;它们不用于映射目标属性。所以你可以做一些事情(它应该在理论上起…

用带参数的方法给空数组放元素,寻找数组里面的值是否存在。

package ch08;import java.util.Scanner;/** * Created by liwenj on 2017/7/20. */public class Person { String[] names new String[30];//把为null的元素添加内容 void addName(String name) { for (int i 0; i < names.length; i) { if (nam…

centos中配置java视频教程_安装CentOs

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作…

python-day8-赋值

# x10#链式赋值# abcdef10# print(a,b,c,d,e,f)#增量赋值# x10# ya# tempx# xy# ytemp# print(x,y)# x,yy,x# print(x,y)#值的解压# msghello# l[1,2,3]# a,b,c,d,emsg# print(a,b,c,d,e)# a,_,_,_,emsg# a,*_,emsg# print(a)# print(e)# dic{a:1,b:2,c:3}# x,y,zdic# print(x,…

java getapplicationcontext_java – getApplicationContext()中的空指针

我正在尝试以下代码,其中一个服务正在实现我的监听器&#xff1a;public class MyListenerClass extends Service implements MyListenerInterface {public void onCurrencyRecieved(MyEventClass event) {System.out.println("Coins Recieved - Listener Successful"…