《Java核心密卷36讲》11-12讲学习笔记

杨晓峰Java核心36讲学习笔记 最近在极客时间上订阅了Oracle首席工程师杨晓峰的Java核心技术36讲, 接下来会对每一课的学习: 记下学习笔记 有不懂的地方继续深入 一些思考或者总结。 下面从第一课开始,Exception和Error有什么区别。 Exception 和Error都继承自Throwable父类。 Error是指正常运行情况下,不太可能出现的情况,一旦Error发生一般都会导致程序处于非正常不可恢复的... 阅读详情

目录

Java提供了哪些IO方式? NIO如何实现多路复用?

Java有几种文件拷贝方式?哪一种最高效?


Java提供了哪些IO方式? NIO如何实现多路复用?

典型回答

Java IO方式有很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分。

 

首先,

传统的java.io包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输 出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。

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

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

 

第二,

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

 

第三,

在Java 7中,NIO有了进一步的改进,也就是NIO 2,引入了异步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。

异步IO操作基于事件和回调机制,可以简单 理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

知识扩展

区分同步或异步(synchronous/asynchronous)。

简单来说,同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;

而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。

 

区分阻塞与非阻塞(blocking/non-blocking)。

在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如ServerSocket新连接建立 完毕,或数据读取、写入操作完成;

而非阻塞则是不管IO操作是否结束,直接返回,相应操作在后台继续处理。

不能一概而论认为同步或阻塞就是低效,具体还要看应用和系统特征。

 

对于java.io,我们都非常熟悉,我这里就从总体上进行一下总结。总体上,我认为你至少需要理解:

IO不仅仅是对文件的操作,网络编程中,比如Socket通信,都是典型的IO操作目标。

输入流、输出流(InputStream/OutputStream)是用于读取或写入字节的,例如操作图片文件。

而Reader/Writer则是用于操作字符,增加了字符编解码等功能,适用于类似从文件中读取或者写入文本信息。本质上计算机操作的都是字节,不管是网络通信还是文件读 取,Reader/Writer相当于构建了应用逻辑和原始数据之间的桥梁。

BuferedOutputStream等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高IO处理效率。这种设计利用了缓冲区,将批量数据进行一次操作,但在使用中千万别忘 了fush。

参考下面这张类图,很多IO工具类都实现了Closeable接口,因为需要进行资源的释放。比如,打开FileInputStream,它就会获取相应的文件描述符(FileDescriptor),需要 利用try-with-resources、 try-fnally等机制保证FileInputStream被明确关闭,进而相应文件描述符也会失效,否则将导致资源无法被释放。利用专栏前面的内容提到 的Cleaner或fnalize机制作为资源释放的最后把关,也是必要的。

NIO的主要组成部分:

Bufer,

高效的数据容器,除了布尔类型,所有原始数据类型都有相应的Bufer实现。

 

Channel,

类似在Linux之类操作系统上看到的文件描述符,是NIO中被用来支持批量式IO操作的一种抽象。

 

File或者Socket,

通常被认为是比较高层次的抽象,而Channel则是更加操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,获得特定场景的性能优 化,例如,DMA(Direct Memory Access)等。不同层次的抽象是相互关联的,我们可以通过Socket获取Channel,反之亦然。

 

Selector,

是NIO实现多路复用的基础,它提供了一种高效的机制,可以检测到注册在Selector上的多个Channel中,是否有Channel处于就绪状态,进而实现了单线程对 多Channel的高效管理。 Selector同样是基于底层操作系统机制,不同模式、不同版本都存在区别。

 

Chartset,

提供Unicode字符串定义,NIO也提供了相应的编解码器等,例如,通过下面的方式进行字符串到ByteBufer的转换: Charset.defaultCharset().encode("Hello world!"));

NIO能解决什么问题

IO都是同步阻塞模式,所以需要多线程以实现多任务处理。

而NIO则是利用了单线程轮询事件的机制,通过高效地定位就绪的Channel,来决定做什 么,仅仅select阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。

Java有几种文件拷贝方式?哪一种最高效?

典型回答

Java有多种比较典型的文件拷贝实现方式,比如:

 

利用java.io类库,直接为源文件构建一个FileInputStream读取,然后再为目标文件构建一个FileOutputStream,完成写入工作。

利用java.nio类库提供的transferTo或transferFrom方法实现。

Java标准类库本身已经提供了几种Files.copy的实现。

对于Copy的效率,这个其实与操作系统和配置等情况相关,总体上来说,NIO transferTo/From的方式可能更快,因为它更能利用现代操作系统底层机制,避免不必要拷贝和上下 文切换。

知识扩展

拷贝实现机制分析

先来理解一下,前面实现的不同拷贝方法,本质上有什么明显的区别。

内核态空间(Kernel Space),这是操作系统层面的基本概念,操作系统内核、硬件驱动等运行在内核态空间,具有相对高的特 权;

用户态空间(User Space),则是给普通应用和服务使用。

当我们使用输入输出流进行读写时,实际上是进行了多次上下文切换,比如应用读取数据时,先在内核态将数据从磁盘读取到内核缓存,再切换到用户态将数据从内核缓存读取到用 户缓存。 写入操作也是类似,仅仅是步骤相反,你可以参考下面这张图。

这种方式会带来一定的额外开销,可能会降低IO效率。

 

而基于NIO transferTo的实现方式,在Linux和Unix上,则会使用到零拷贝技术,数据传输并不需要用户态参与,省去了上下文切换的开销和不必要的内存拷贝,进而可能提高应用 拷贝性能。

注意,transferTo不仅仅是可以用在文件拷贝中,与其类似的,例如读取磁盘文件,然后进行Socket发送,同样可以享受这种机制带来的性能和扩展性提高。

transferTo的传输过程是:

 

 

Java核心面试题——精选36道核心面试题 目录java核心面试题1、java个版本中更新的重要功能1.1 java 14版本中更新的重要功能1.2 java 13版本中更新的重要功能1.3 java12版本中更新的重要功能1.4 java11版本中更新的重要功能1.5 java10版本中更新的重要功能1.6 java9版本中更新的重要功能1.5 java8版本中更新的重要功能2、java面向对象编程的特征3、 [JVM](https://blog.youkuaiyun.com/issunmingzhi/article/details/104774941)4、J 阅读详情

相关推荐

Java2核心密卷教程(初中高级)

本教程特别适合那些刚刚踏入Java程序采鸟们:第一部分:详细讲述了Java初级教程;第二部分:详细讲述了Java高级应用

Java核心密卷知识点新整理1---4章节

对大多数同学来说在系统学习入门java基础知识以后依旧有很多 很多需要查缺补漏的地方,核心密卷这本书可以更好的进行基础的巩固和拓展,这本为第一卷 基础大多数都学过,将重要和易混的地方进行整理。 第一本较为基础可以用电子版,核心密卷2建议买书研究。 需要核心密卷1电子版的同学可以私信给 一:最开始的当然是配置环境和安装java编译软件,本人用的idea比较好用(idea有试用期,购买较为昂贵,博主可以提供...

qq_65149239的博客 447

搭建PX4开发系统(Ubuntu 22.04)

本文是《从零开始学 PX4 无人机开发》系列第二篇,适合开发者在 Ubuntu 系统下快速搭建 PX4 编译与仿真环境,支持 QGroundControl、Gazebo、MAVSDK 等完整工具链。

qq_15856721的博客 4198

《Java核心密卷36讲》9-10讲学习笔记

对比Hashtable、HashMap、TreeMap有什么不同? Hashtable、HashMap、TreeMap 三者均实现了Map接口,存储的内容是基于key-value的键值对映射,一个映射不能有重复的键,一个键最多只能映射一个值。 (1) 元素特性 HashTable中的key、value都不能为null; HashMap中的key、value可以为null,很显然只能有一个key为null的键值对,但是允许有多个值为null的键值对; TreeMap中当未实现 Compar...

qq_45839708的博客 185

基于PDF文档结构的数字隐写

PDF隐写

xiongshivigor的博客 1426

第 2 章:PassThrough 直通滤波

通过设置某个维度(如 x、y、z 或 rgb)的取值范围,仅保留该范围内的点,从而达到**点云裁剪(裁边)**或过滤异常值的目的。所有在该范围之外的点会被移除(可选是否保留);点云中包含背景、地面或传感器噪声,需要过滤;通过 z 轴过滤,只保留桌面上方的物体;多轴组合过滤(如同时过滤 x、y、z);可用于地面剔除、车载点云预处理等场景。不支持一次过滤多个字段,可多次调用;仅处理某一层或某一区域的点云数据。原始点云中包含地面、墙面、背景等;在区域裁剪、前景提取中广泛使用;设定一个轴(如z轴);

yumeiguo的博客 337

Java核心技术36讲(整理)

1、谈谈你对 Java 平台的理解? “Java 是解释执行”,这句话正确吗? Java特性: 面向对象(封装,继承,多态) 平台无关性(JVM运行.class文件) 书写一次,到处运行”(Write once, run anywhere) 语言(泛型,Lambda) 类库(集合,并发,网络,IO/NIO) JRE(Java运行环境,JVM,类库) JDK(Java开发工具,包括JRE,jav...

Muscleheng的博客 1万+

【MATLAB代码】TDOA+TOA融合算法,高精度定位。通过多边定位解算4个锚点、平面目标的位置,附代码

二维平面下的TOA、TDOA及混合定位算法,通过4个锚节点对目标点进行定位。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 210

【总结】Java核心技术36讲知识点大纲

前段时间在极客时间上购买了杨晓峰老师的《Java核心技术36讲》,趁着这段时间有空,对相关知识点做了一个整体的目录,也对自己所掌握的Java基础进行了一个复习和梳理,若想深入学习,可以购买相关专栏,也可以对着该知识点查阅相关资料,源码等自学。—-kayfen 文末附专栏链接 Java核心技术36讲知识点总结 1 Java平台的理解 Java的特性,解释运行和编译运行 2 E...

Kaybee - 练级之路 1万+

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理..

珞瑜的博客 1万+

【具身智能】感知 × 决策 × 执行:一个智能体的认知闭环怎么搭?

构建一个真正能在现实世界中运作的具身智能体,并不是简单地拼接“视觉 + 控制器 + 动作模块”就能完成的,它必须是一个**认知闭环结构**:能感知环境、理解状态、制定策略、执行动作,并从结果中学习反馈。 本讲将深入剖析具身智能的三大核心支柱:**感知系统、决策系统、执行系统**,并解析它们如何协同构建出一个“能观察、能思考、能行动”的智能体。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3262

《Java核心密卷36讲》1-2讲学习笔记

“一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装 好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以 才有了Java一次编译,到处运行这样的效果。 严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处

qq_45839708的博客 194

Mysql授权允许远程访问

前言 Mysql授权允许远程登录后,linux中安装的mysql可以与Navicat for Mysql(可视化)等连接,在可视化软件下管理数据库。 注意:不能使用临时密码 设置密码命令: alter user 'root'@'localhost' identified by '这里是你的密码'; 授权允许远程访问 一、授权命令: grant all privileges on *.* to '...

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

《Java核心密卷36讲》5-6讲学习笔记

目录 String、StringBufer、StringBuilder有什么区别? 动态代理是基于什么原理? String、StringBufer、StringBuilder有什么区别? 1 String (1) String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对 象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新.

qq_45839708的博客 263

PDBfixer: PDB修补蛋白残基

PDBFixer是一款专门用于修复蛋白质数据库(PDB)文件常见问题的工具。它能自动处理X射线晶体学结构中常见的缺陷,包括缺失氢原子、不完整侧链、非标准残基等问题。该工具提供三种使用方式:图形界面、命令行和Python API,支持添加缺失原子(全部/重原子/氢原子)、替换非标准残基、补全缺失残基等功能。特别适用于分子动力学模拟前的预处理,可自动添加水盒子并调整离子浓度。用户可通过简单命令或自定义脚本实现复杂修复流程,内置非标准残基替换表确保结构标准化。

Protein Designer的博客 933

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《Java核心密卷36讲》7-8讲学习笔记

目录 int和Integer有什么区别? 对比Vector、ArrayList、LinkedList有何区别? int和Integer有什么区别? 1 int和Integer JDK1.5引入了自动装箱与自动拆箱功能,Java可根据上下文,实现int/Integer,double/Double,boolean/Boolean等基本类型与相应对象之间的自动转换,为开发过程带来极大便利。 最常用的是通过new方法构建Integer对象。 但是,基于大部分数据操作都是集中在有限的、较小的数值范围,

qq_45839708的博客 202

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《Java核心密卷36讲》3-4讲学习笔记

目录 谈谈fnal、fnally、 fnalize有什么不同? 强引用、软引用、弱引用、幻象引用有什么区别? 谈谈fnal、fnally、 fnalize有什么不同? fnal可以用来修饰类、方法、变量,分别有不同的意义,fnal修饰的class代表不可以继承扩展,fnal的变量是不可以修改的,而fnal的方法也是不可以重写的(override)。 fnally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-fnally或者try-catch-fnally来进行类似关闭J.

qq_45839708的博客 341

STM32F407中文手册

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java核心技术36讲:Oracle首席工程师帮你搞定BAT面试

作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万,而自己却囊中羞涩。于是你也想看看新机会,找个新平台,好好发展。 但是面试的时候,当那个笑眯眯的面试官问出那些你再熟悉不过的 Java 问题时,你只是感觉似曾相识,却怎么也回答不到点上。比如 Hash...

weixin_43213222的博客 302

杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?

杨晓峰-java核心技术36讲(学习笔记) 接下来我会分享杨晓峰-java核心技术36讲的学习笔记,内容较多,补充了其中一些牛人评论,相对详细(仅供个人学习记录整理,希望大家支持正版:https://time.geekbang.org/column/intro/100006701) 第1讲 | 谈谈你对Java平台的理解? 谈谈你对Java平台的理解?“Java是解释执行”,这句话正确吗? 典型回答 Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write on

niuyan666的博客 709

Java核心技术36讲读书笔记

Java核心技术36讲读书笔记 这是在极客头条上的一个专栏的读书笔记 文章目录Java核心技术36讲读书笔记谈谈你对java平台的理解解答扩展jdk中常用的调试工具有哪些?编译执行和解释执行的区别?常见的编译语言和解释语言都有哪些?Exception和Error的区别解答扩展常见的Error和Exception都有哪些NoClassDefFoundError和ClassNotFoundExcept...

_TheDawn_的博客 653

极客时间Java核心技术36讲 个人笔记

第三讲 try-with-resources jdk7之后异常处理的一个新方法,在try()中声明的资源,不用再finally中手动释放,而是系统自动会调用close()方法

微雨燕双飞 5913

Java核心技术36讲 - 学习笔记

第9讲 对比Hashtable、HashMap、TreeMap有什么不同? 一、主要不同点 数据结构 底层实现 线程安全 性能 支持null键值 HashTable 基于哈希表 是 HashMap 基于哈希表 否 TreeMap 基于红黑树 否 1. - 基于哈希表实...

Funn Rose's Blog 2304

Java核心技术36讲阅读笔记(1)

Java核心技术36讲阅读笔记(1) 本文参考极客时间杨晓峰-Java核心技术36讲 本文为博主阅读《Java核心技术36讲》整理的笔记,如需转载,请附上本文链接 1.对“Write once,run anywhere!"的理解 “一次编写,到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平...

luoru的博客 723

Java核心技术·卷I(原书第12版)

他是《Java核心技术》两卷本的作者,也是《重要的,第二版》(Addison-Wesley,2018)的Core Java SE 9和《重要的,第二版》(Addison-Wesley,2017)的作者。读者应在充分理解Java语言和Java类库的基础上,灵活应用Java提供的高级特性,包括面向对象编程、反射和代理、接口和内部类、异常处理、泛型编程、集合框架、事件监听器模型、图形用户界面设计和并发。☉第四章介绍了面向对象的两大基石——封装的重要概念,以及Java语言实现封装的机制——类和方法;

jascl的博客 1万+

Java核心技术36讲笔记

一共43讲,大约需要10h 开篇词 1讲 java基础 14讲 java进阶 16讲 java安全基础 2讲 java性能基础 3讲 java应用开发扩展 4讲 周末福利 2讲 结束语 1讲 开篇词(1讲) 开篇词 | 以面试题为切入点,有效提升你的Java内功 初级、中级 Java 工程师要求:扎实的java和计算机科学基础,掌握主流开...

weixin_30834783的博客 237
上一篇: 数据库错题集(一)
下一篇: 《数据结构与算法之美》9讲学习笔记
皮皮杨233
博客等级 码龄7年 42粉丝 75原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值