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.mzph.cn/news/138023.shtml

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

相关文章

Java-多态

1. 多态 1.1 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 1.2 多态实现条件 在java中要实现多态,必须要满足如下几个条件,缺一不…

vivado时序分析-3时序分析关键概念

1、时钟相移 时钟相移对应于延迟时钟波形 , 此波形与因时钟路径内的特殊硬件所导致的参考时钟相关。在 AMD FPGA 中 , 时钟相移通常是由 MMCM 或 PLL 原语引入的 , 前提是这些原语的输出时钟属性 CLKOUT*_PHASE 为非零值。 时序分析期间…

Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】

一、传统磁盘管理的弊端 传统的磁盘管理:使用MBR先对硬盘分区,然后对分区进行文件系统的格式化最后再将该分区挂载上去。 传统的磁盘管理当分区没有空间使用进行扩展时,操作比较麻烦。分区使用空间已经满了,不再够用了&#xff…

如何使用HadSky搭配内网穿透工具打造个人站点并公网访问

🌈个人主页:聆风吟 🔥系列专栏:Cpolar杂谈、数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 前言一. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 二. 本地网页发…

【算法 | 模拟No.4】AcWing 756. 蛇形矩阵 AcWing 40. 顺时针打印矩阵

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程&a…

【chat】4: ubuntu20.04:数据库创建:mysql8 导入5.7表

【chat】3: ubutnu 安装mysql-8 并支持远程访问 已经支持 8.0的SQLyog 远程访问:大神2021年的文章:sql是5.7的版本,我使用的ubuntu20.04,8.0版本:chat数据库设计 C++搭建集群聊天室(七):MySQL数据库配置 及项目工程目录配置 User表,以id 唯一标识 Friend 表,自己的id…

JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件(布局) , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 GridPane gridPane new GridPane(); 我们将要排出这个布局 , 也就是登陆页…

如何通过命令查看某一文件的内容改动和提交记录

1. 查看最近10条的提交记录 一行显示 git log --oneline -102.查看某一个文件的提交记录 git log --oneline -10 文件路径3.查看某个文件的修改内容 查看某次提交的修改 内容 git show bcd9299 查看某次提交某个文件的修改内容git show bcd9299 文件路径4.对比两次提交内容的…

【STM32】HAL库UART含校验位的串口通信配置BUG避坑

【STM32】HAL库UART含校验位的串口通信配置BUG避坑 文章目录 UART协议校验位HAL库配置含校验位的串口配置BUG避坑附录:Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏定义总线函…

新生儿夜惊:原因、科普和注意事项

引言: 新生儿夜惊是一种常见的现象,它可能让新父母感到焦虑和不安。夜惊通常表现为婴儿在夜间忽然惊醒、哭闹,并伴随着呼吸急促和肌肉紧张。尽管这在大多数情况下是正常的生理现象,但对于父母来说,了解夜惊的原因和适…

HTML点击链接强制触发下载

常见网页中会有很多点击链接即下载的内容&#xff0c;以下示范一下如何实现 <a href"文件地址" download"下载的文件名字&#xff08;不包括后缀&#xff09;">强制下载</a> 下面举个例子&#xff1a; <a href"./image/test.jpg"…

Mysql配置主从复制-GTID模式

目录 主从复制 主从复制的定义 主从复制的原理 主从复制的优势 主从复制的形式 主从复制的模式 主从复制的类型 GTID模式 GTID的概念 GTID的优势 GTID的原理 GTID的配置 Mysql主服务器 ​编辑 Mysql从服务器 ​编辑 主从复制 主从复制的定义 是指把数据从一个…

缓存与数据库双写一致性几种策略分析

一、背景 在高并发场景中&#xff0c;为防止大量请求直接访问数据库&#xff0c;缓解数据库压力&#xff0c;常用的方式一般会增加缓存层起到缓冲作用&#xff0c;减少数据库压力。引入缓存&#xff0c;就会涉及到缓存与数据库中数据如何保持一致性问题&#xff0c;本文将对几…

财税服务展示预约小程序的作用是什么

财税财政往往困扰着很多公司&#xff0c;尤其是公司里没有相应职员或工作压力大的情况下&#xff0c;不少商家就会寻找代理记账、审计服务、会计代理等服务的机构。 对财政服务代理机构&#xff08;会计公司&#xff09;来说&#xff0c;市场企业多而广&#xff0c;理论上来说…

Could not load library libcudnn_cnn_train.so.8, 解决类似问题的思路与方法

完整报错 Could not load library libcudnn_cnn_train.so.8. Error: /home/ai/anaconda3/envs/ai/bin/../lib/libcudnn_ops_train.so.8: undefined symbol: _ZN5cudnn3ops26JoinInternalPriorityStreamEP12cudnnContexti, version libcudnn_ops_infer.so.8 错误原因 该错误其…

C++多态特性

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

新方向!文心一言X具身智能,用LLM大模型驱动智能小车

具身智能已成为近年来研究的热点领域之一。具身智能强调将智能体与实体环境相结合&#xff0c;通过智能体与环境的交互&#xff0c;来感知和理解世界&#xff0c;最终实现在真实环境中的自主决策和运动控制。 如何基于文心大模型&#xff0c;低成本入门“具身智能”&#xff0…

YOLOv8模型ONNX格式INT8量化轻松搞定

ONNX格式模型量化 深度学习模型量化支持深度学习模型部署框架支持的一种轻量化模型与加速模型推理的一种常用手段&#xff0c;ONNXRUNTIME支持模型的简化、量化等脚本操作&#xff0c;简单易学&#xff0c;非常实用。 ONNX 模型量化常见的量化方法有三种&#xff1a;动态量化…

刚安装的MySQL使用Navicat操作数据库遇到的问题

刚安装的MySQL使用Navicat操作数据库遇到的问题 一、编辑连接保存报错二、打开数据表很慢三、MySQL的进程出现大量“sleep”状态的进程四、执行sql脚本报错&#xff0c;部分表导不进去五、当前MySQL配置文件 一、编辑连接保存报错 连接上了数据库&#xff0c;编辑连接保存报错…

Linux下内网穿透实现云原生观测分析工具的远程访问

&#x1f4d1;前言 本文主要是Linux下内网穿透实现云原生观测分析工具的远程访问设置的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &…