BIO/NIO学习

news2024/11/27 20:36:15

在传送文件的时候常常出现这么一个问题,就是当客户端的文件全部传送完了之后,服务器没有接收到客户端那边传过的停止信号,所以服务器也就跟着客户端停止运行了,我们可以使用

  try {
            socket.shutdownOutput();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

这么一段代码使客户端的soket连接中断,这样就告诉了服务器那边 客户端已经运行完了

 

这三个输入流在 Java 中都用于从各种源(如文件、网络、内存等)中读取数据,但它们之间有一些区别:

  1. InputStream 是所有字节输入流的抽象类,它是字节输入流的基类。它提供了读取字节的基本方法,但是不能直接处理字符数据。

  2. InputStreamReader 是字节流到字符流的桥梁。它将字节流转换为字符流,可以指定编码方式,方便地读取字符数据。

  3. BufferedInputStream 是对输入流的缓冲,它实际上是一个装饰器模式的应用,用于提高输入流的读取效率。它通过在内存中建立一个缓冲区,减少了对磁盘的访问次数,提高了读取性能。

总结来说,InputStream 是字节输入流的抽象类,InputStreamReader 用于将字节流转换为字符流,而 BufferedInputStream 则是对输入流的缓冲,用于提高读取性能。

Buffer的主要作就是装入数据,然后输出数据,相当于一个竹筒,通过put方法放入数据,没放一些数据 Nuffer的position相应的就会向后移动一些位置。
  当Buffer装入这些数据结束后,条用Buffer的flip()方法,该方法将limit设置为position所在位置,评奖position设为0,这就是的Buffer的读写指针又移到了开始的位置,也就是卓,Buffer调用flip()方法之后,BUffer为输出数据做好准备,当Buffer输出数据结束之后,Buffer调用clear方法,clear()不是将Buffer里面的数据清空,它仅仅只是将position的位置设置为0,后面的数据会将position后面的数据覆盖,将limit设置为capacity,这样就为后面再一次装入数据做好准备

Buffer的样子

在这里需要区分rewind和flip方法

flip()rewind() 是 ByteBuffer 类中的两个重要方法,它们都用于在读写操作之间调整缓冲区的位置和限制。

  1. flip() 方法:

    • flip() 方法的作用是将缓冲区从写模式切换到读模式。在写模式下,通过 put() 方法向缓冲区写入数据时,position 会逐渐增加,limit 则保持不变。而在读模式下,准备从缓冲区中读取数据时,需要将 position 设置为 0,同时将 limit 设置为之前的 position,以限制读取的数据范围。
    • 具体来说,flip() 方法会将 limit 设置为当前 position,然后将 position 设置为 0,这样就完成了从写模式到读模式的切换
  2. rewind() 方法:

    • rewind() 方法的作用是将 position 设置为 0,以便重新读取缓冲区中的数据,而不影响 limit 的值。这意味着可以重复读取缓冲区中的数据,而不必改变 limit 的设定。
    • 通常情况下,rewind() 方法用于在再次读取先前写入的数据之前,将 position 设置为 0。

Channel可以直接将指定文件的部分或者全部直接映射成Buffer

文件在计算机中实际上是存储在磁盘上的,但在程序运行时,文件内容会被读取到计算机的内存中进行处理。当你打开一个文件时,操作系统会将文件的内容加载到内存中,以便程序可以直接从内存中读取和操作文件数据。

当你使用传统的文件 I/O 操作(比如使用InputStream和OutputStream)时,需要显式地将文件内容从磁盘读取到内存中,并且在写入文件时也需要将数据从内存写回到磁盘。这个过程涉及了磁盘 I/O 操作,而磁盘访问通常比内存访问要慢得多。

而通过NIO中的文件映射(FileChannel.map()方法),可以直接将文件的部分或全部内容映射到内存中的ByteBuffer中,从而实现基于内存的文件读写操作。这样可以避免传统的文件I/O操作,提高了文件I/O操作的性能和灵活性。

因此,无论是传统的文件 I/O 操作还是NIO中的文件映射,文件内容都会被加载到计算机的内存中进行处理。

非阻塞的NIO连接方式差不多是这个样子

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

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

相关文章

项目构建工具maven

一、概述 1、maven是apache的一个开源项目,是一个优秀的项目构建/管理工具 2、apache(软件基金会、非盈利组织、管理维护一些开源项目) 二、功能 1、管理项目中jar包和jar包与jar包之间的依赖 2、完成项目编译、测试、打包 三、核心文件 pom.xml:在里面配置相…

华为机考入门python3--(26)牛客26-字符串排序

分类:字符串 知识点: 字符串是否仅由字母构成 my_str.isalpha() 字母列表按小写排序 letters.sort(keylambda x: x.lower()) 题目来自【牛客】 def custom_sort(input_str):letters []non_letters []for char in input_str:if char.isalpha…

华语电影新力量用短片讲述:一部好电影,影响深远

近日,上汽大众杯澳涞坞全球青年电影短片大赛的公益短片《首映》在澳门澳涞坞首映发布,这一作品不仅展示了电影人的真实生活,更深刻地传达了对华语电影的敬意以及对青年电影人的殷切期望。 短片《首映》的制作团队堪称豪华。资深导演杨枫担任…

IT人的拖延——一放松就停不下来,耽误事?

拖延的表现 在我们的日常工作中,经常会面对这样一种情况:因为要做的Sprint ticket比较复杂或者长时间的集中注意力后,本来打算休息放松一下,刷刷剧,玩玩下游戏,但却一个不小心,没控制住时间&am…

IGMP——组播成员端网络协议

目录 一.IGMP基本概念 (1)组播转发困境 (2)感知组播成员方式 (3)IGMP版本 二.IGMP各版本的区别与联系 (1)IGMPV1 1.普遍组查询报文 2.成员关系报告报文 3.IGMPV1报文格式 4…

生成验证码的奥秘:从列表到字符串的魔法转换

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:验证码生成的背景与需求 二、生成验证码的方法一:列表生成…

ACM Proceedings Template 使用方法

模板导入 打开ACM Primary Article Template官网,可以看到自带overleaf模板,接下来我们使用overleaf来自动导入模板。 选择你需要的ACM Conference or Journals模板,然后Open as Template 栏目说明 接下来依次解释一下左边栏目的作用 …

装机必备——360压缩安装教程

装机必备——360压缩安装教程 软件下载 软件名称:360压缩 软件语言:简体中文 软件大小:3.38M 系统要求:Windows7或更高, 32/64位操作系统 硬件要求:CPU2GHz ,RAM4G或更高 下载通道①迅雷云盘丨…

14、类与对象(采用图解方式分析内存结构)①

在idea中创建一个新文件,名称为Hello.java 其中,Hello就是一个类,main是这个类里面的方法,这意味着我们在学习的时候已经在使用类了。 对象和类 一、概念二、⭐内存分配机制分析Ⅰ、基本内存结构⭐⭐Ⅱ、调用类方法的内存分析&am…

HCIP的学习(24)

第七章,VLAN—虚拟局域网 ​ 通过在交换机上部署VLAN技术,将一个规模较大的广播域在逻辑上划分成若干个不同的、规模较小的广播域。 ​ IEEE 802.1Q标准----虚拟桥接局域网标准----Dot1Q标准 标签协议标识符:0x8011(代表数据帧是8…

MySQL数据库案例实战教程:数据类型、语法与高级查询详解

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【Python-OS】os.path.splitext()

作用:将文件路径分割成文件名和扩展名两部分。 slide_id, _ os.path.splitext(slide) print("slide:") print(slide) print("slide_id:") print(slide_id)注: slide是文件名,可以自行赋值

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997

问题说明 最近在使用美光EMMC的时候,发现通过芯片丝印查询不到 芯片的规格说明书; 经过查阅资料,发现美光的EMMC芯片 “由于空间限制,FBGA 封装组件具有与部件号不同的缩写部件标记”,需要通过官网查询丝印的FBGA cod…

极验3逆向 JS逆向最新点选验证码 逆向分析详解

目录 声明! 一、请求流程分析 二、w参数生成位置 三、主要问题 四、结果展示 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 声明! 本文章中所有内容仅供学习交流…

《中国科技投资》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答: 问:《中国科技投资》期刊什么级别? 答:国家级 问:《中国科技投资》期刊是核心期刊吗? 答:不是,是万方维普收录的正规期刊。 主管单位:中国信息协会 主办单位&#…

SwiftUI中EnvironmentObject的使用(多界面共享数据)

SwiftUI的EnvironmentObject是一个强大的工具,它允许你在多个视图之间共享数据(使用一个可观察对象)。当你有一个复杂的视图层次结构,并且需要在没有直接连接的视图之间共享相同的可观察对象时,它特别有用。 我们之前传递数据主要是通过init…

详解 Scala 的变量、标识符、数据类型

一、注释 Scala 注释与 Java 一致 // 单行注释/** 多行注释*//*** 文档注释*/二、变量与常量 1. 语法 // 变量,类型可以省略 var varName:varClass value // 常量,类型可以省略 val valName:valClass value2. 案例 // 使用 var/val 才会在类中声明属…

【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)

作品展示 背景需求 【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)-CSDN博客文章浏览阅读343次,点赞10次,收藏6次。【教学类-58-05】黑白三角拼图…

线性插值的频域特性

1、抽取和插值的简单说明 抽取和插值是变采样过程中常用的两种手段,其中抽取的目的是降低数据的采样率,以降低对系统存储深度或计算量的要求。插值的目的是提高数据的采样率,以提高系统的计算精度。 M M M倍抽取通常是通过每隔 M M M…

卧槽!这项目开源了!【送源码 】

随着科技的飞速发展,个人财务管理变得越来越重要。一个名为‘Maybe’的创新型个人财务与财富管理应用程序随之诞生,它以其丰富的功能和用户友好的界面受到了广大用户的关注。 现在项目方将这个价值 100万美元的个人理财应用项目开源了 Maybe Maybe应用…