Java 之 IO/NIO/OKIO

BIO  = blocking io

AIO = Asynchronous IO

从内存读取到写入--输出

从外部到内存 -- 输入

 OutputStream //文件不存在则自动创建

 try {OutputStream outputStream = new FileOutputStream("text.txt");outputStream.write('a');outputStream.write('b');} catch (IOException e) {throw new RuntimeException(e);}

读取,写入实在内存开辟空间,然后进行读写,需要及时释放

Reader ---- BufferReader

 try (InputStream inputStream = new FileInputStream("text.txt")){ //1Reader reader = new InputStreamReader(inputStream); //2BufferedReader bufferedReader = new BufferedReader(reader);// 3,增加bufferSystem.out.println(bufferedReader.readLine());inputStream.close();} catch (IOException e) {//closethrow new RuntimeException(e);} finally {//close}

嵌套了三层

BufferRead 预先读 增加性能

默认8192个字节

private static int defaultCharBufferSize = 8192;
private static int defaultExpectedLineLength = 80;
bufferedOutputStream.write 需要主动flush 或者等缓冲区 8192字节满的时候才会写入,因为有缓冲

关闭close 的时候也会自动flush

 try (OutputStream outputStream = new FileOutputStream("text.txt"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream)) {}//通过这种方式也会自动flush

Android copy文件 FileUtils.copy

copy文件

try (InputStream inputStream = new FileInputStream("text.txt");OutputStream outputStream = new FileOutputStream("text1.txt")) {byte[] data = new byte[1024]; //每次读的字节int read;//读取的个数while ((read = inputStream.read(data)) != -1) {
//读取是个循环过程,读多少就写入多少,如果读完就是-1
//写入字节,从起始位置到读取的数量outputStream.write(data, 0, read);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}

可以通过buffer 减少其交互,增加性能

  try (InputStream inputStream = new BufferedInputStream(new FileInputStream("text.txt"));OutputStream outputStream = new BufferedOutputStream(new FileOutputStream("text1.txt"))) {byte[] data = new byte[1024];int read;while ((read = inputStream.read(data)) != -1) {outputStream.write(data, 0, read);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}

不然每次读写交互频率较高

Socket:

 try (Socket socket = new Socket("sougou.com", 80);BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {// getOutputStream 写入//getInputStream 读取writer.write("GET / HTTP/1.1\n" + "HOST: www.example.com\n\n"); //请求报文writer.flush(); //提交String message;while ((message = reader.readLine()) != null) {//读取相应内容System.out.println(message);}} catch (IOException e) {throw new RuntimeException(e);}

NIO

传统IO  Stream /管道 

NIO       Channel/ 双向

NIO   Buffer

Buffer 可以操作,强制使用

非阻塞式 //支持非阻塞式,默认阻塞式,只有网络交互时支持非阻塞式,文件交互不支持

     try {//capacity limit 上限,移动位置 一般不变//position 位置,指针位置
//r 读权限,w 写入RandomAccessFile randomAccessFile = new RandomAccessFile("text.txt","rw");FileChannel fileChannel = randomAccessFile.getChannel();ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //目前不支持读取fileChannel.read(byteBuffer);//这两行等同于下面一行byteBuffer.limit(byteBuffer.position());byteBuffer.position(0);//等同于这种写法byteBuffer.flip();System.out.println();} catch (IOException e) {throw new RuntimeException(e);}

每次读完都要clear 

byteBuffer.clear();

阻塞式NIO

    try {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(80));SocketChannel socketChannel = serverSocketChannel.accept();//阻塞式ByteBuffer byteBuffer = ByteBuffer.allocate(1024);socketChannel.read(byteBuffer);byteBuffer.flip();System.out.println(byteBuffer);byteBuffer.clear();} catch (IOException e) {throw new RuntimeException(e);}

非阻塞式

serverSocketChannel.configureBlocking(false); //默认true 阻塞式

   try {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(80));serverSocketChannel.configureBlocking(false);//非阻塞Selector selector = Selector.open();//选择器serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);//注册while (true){selector.select();//选择for (SelectionKey key : selector.selectedKeys()){if (key.isAcceptable()){SocketChannel  socketChannel = serverSocketChannel.accept();ByteBuffer byteBuffer = ByteBuffer.allocate(1024);while (socketChannel.read(byteBuffer) != -1){byteBuffer.flip();System.out.println(byteBuffer);byteBuffer.clear();}}else break;}}} catch (IOException e) {throw new RuntimeException(e);}

OKIO

基于NIO进行包装

也是基于管道 ,单向  Source 和 Sink

支持Buffer /可以对Buffer 进行操作 / 不强制使用Buff

read(buffer) buffer是写的操作

从buffer取出是读操作,buffer读是写操作

File().copyTO

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

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

相关文章

Python使用Numba装饰器进行加速

Python使用Numba装饰器进行加速 前言前提条件相关介绍实验环境Numba装饰器进行加速未加速的代码输出结果 numba.jit加速的代码输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入Python日常小操作专栏、Ope…

已解决:Rust Error: the trait bound is not satisfied 问题

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

python的format函数的用法及实例

目录 1.format函数的语法及用法 (1)语法:{}.format() (2)用法:用于格式化字符串。可以接受无限个参数,可以指定顺序。返回结果为字符串。 2.实例 (1)不设置位置&…

煤矿企业如何选择合适的设备健康管理系统

在煤矿开采的过程中,机电设备发挥着重要的作用。但大量的机电设备的使用也给煤矿企业设备管理提出了一定的要求。随着工业领域数字化的深入应用,煤矿机电设备的自动化、智能化管理已经成为煤矿企业发展的重要手段。保障机电设备的正常运行,减…

Spring Boot框架配置WebSocket【一遍过,不过你评论骂我】

【找了无数的文档资料总结】 【不停的找文档试】 【每一次都显示连接不上】 【终于成了……】 当使用Spring Boot框架配置WebSocket时, 通常会使用@ServerEndpoint注解来标识WebSocket端点, 并通过ServerEndpointExporter来注册这些端点。以下是配置WebSocket的步骤: 步骤…

2023.11.10联测总结

T 1 T1 T1求的是有多少个区间的异或和是 k k k的因子, n , k ≤ 1 0 5 n,k \leq 10^5 n,k≤105。 这道题用前缀和维护一下,暴力枚举所有区间就有 80 80 80分。 有一瞬间想过枚举因数,但是脑抽以为要 O ( n ) \mathcal O(n) O(n)枚举&#x…

传输层中的TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息,明确要传输的数据格式; 应用层协议:这个协议,实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统,驱动,硬件实现好了的,咱们是不需要管 2)应用层:当我…

红海云签约和兆服饰,科技引领服饰行业人力资源数字化转型

和兆服饰从事多品牌多品类经营管理,旗下拥有POLOSPORT、POLOKIDS、CARTELO等国际品牌。作为一个主打POLO文化的服饰品牌,诞生于美国的POLOSPORT拥有现代感的产品设计、系列化的产品搭配、全方位的服务,是最具美国马球精神的休闲时尚服饰品牌之…

基于JavaWeb+SSM+Vue微信小程序校园兼职任务平台系统的设计和实现

基于JavaWebSSMVue微信小程序校园兼职任务平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着社会的发展和全球疫情的冲击,大学生的就业形势越来越严峻。越…

WordPress Modown 6.2付费下载资源/付费查看内容 wp主题模板+erphpdown11.7

模板简介: 自适应响应式设计,兼容主流浏览器 网格样式与瀑布流样式任意切换 内置SEO优化 自带与主题UI完美兼容搭配的erphpdown前端用户中心页面(此功能若单独找我们定制也需要几百) 收费付费下载资源、付费查看内容、付费观看…

LeetCode(1)合并两个有序数组【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 88. 合并两个有序数组 1.题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合…

探索经典算法:贪心、分治、动态规划等

1.贪心算法 贪心算法是一种常见的算法范式,通常在解决最优化问题中使用。 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法范式。其核心思想是选择每一步的最佳解决方案,以期望达到最终的全局最优解。这种算法特点在于只考虑局部最优解&am…

【学术综述】-如何写出一篇好综述-写好综述要注意的问题

文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why?3 做了什么【做了哪些方面的survey】?4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的,花了一天的时间在读这篇surve…

一文学会Scala【Scala一站式学习笔记】

文章目录 为什么要学习Scala语言什么是Scala如何快速掌握Scala语言Scala环境安装配置Scala命令行 Scala的基本使用变量数据类型操作符if 表达式语句终结符循环高级for循环 Scala的集合体系集合SetListMapArrayArrayBuffer数组常见操作Tuple总结 Scala中函数的使用函数的定义函数…

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业,每一次周期性或结构性的变化,都会对企业经营策略带来深远的影响。 2023年前三季度,泛半导体产业迎来结构性复苏。其中,主流显示领域供需关系趋向健康化,半导体显示行业整体上量价…

【Node.js入门】1.1Node.js 简介

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

获取AAC音频的ADTS固定头部信息

文章目录 前言一、AAC音频中的ADTS二、解析ADTS信息1.标准文档中介绍2.解析3.采样率索引和值4.下载AAC标准文档 前言 调试嵌入式设备中播放aac音频的过程中,了解了aac音频格式,记录在此,防止遗忘。 一、AAC音频中的ADTS ADTS(Audi…

2.【自动驾驶与机器人中的SLAM技术】左乘模型推导ESKF

目录 1. 证明题 证明:若某个高斯随机变量为零均值,协方差为对角线矩阵且大小相同(各向同性),那么在乘任意旋转矩阵以后,其均值仍为零,且协方差不变; 2. 代码实现运动方程将F矩阵…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中,我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import(),那 webpack 是如何实现 import() polyfill 的? 原理分析 我们先来看看下面的 demo function component() {const btn docume…

【ARM Coresight OpenOCD 系列 1 -- OpenOCD 介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 OpenOCD 介绍1.1.1 OpenOCD 支持的JTAG 适配器1.1.2 OpenOCD 支持的调试设备1.1.3 OpenOCD 支持的 Flash 驱动 1.2 OpenOCD 安装与使用1.2.1 OpenOCD 代码获取及安装1.2.2 OpenOCD 使用1.2.3 OpenOCD 启用 GDB…