Java 之 IO/NIO/OKIO

news2024/10/6 22:22:42

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")){ //1
            Reader reader = new InputStreamReader(inputStream); //2
            BufferedReader bufferedReader = new BufferedReader(reader);// 3,增加buffer
            System.out.println(bufferedReader.readLine());
            inputStream.close();
        } catch (IOException e) {
            //close

            throw 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.coloradmin.cn/o/1201110.html

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

相关文章

若依Linux与Docker集群部署

若依Linux集群部署 1. 若依2.MYSQL Linux环境安装2.1 MYSQL数据库部署和安装2.2 解压MYSQL安装包2.3 创建MYSQL⽤户和⽤户组2.4 修改MYSQL⽬录的归属⽤户2.5 准备MYSQL的配置⽂件2.6 正式开始安装MYSQL2.7 复制启动脚本到资源⽬录2.8 设置MYSQL系统服务并开启⾃启2.9 启动MYSQL…

终止进程后,GPU显存仍被占用问题 | kill -9彻底杀死进程 | ps aux|grep python

本文部分内容参考博客,十分感谢!!! 问题描述:在Linux终端把进程终止后,发现显存没有被释放出来! ---------------------------------------------------------------------------------------F…

Git分支与Git标签的介绍及其场景应用

目录 一、Git分支 1.1 定义 1.2 基本概念 1.3 特点与优势 1.4 Git分支操作命令 1.4.1 查看分支 1.4.2 创建分支 1.4.3 删除分支 1.4.4 切换分支 1.4.5 创建并切换到新建分支 1.5 场景应用 1.5.1 前期准备 1.5.2 具体操作 二、Git标签 2.1 定义 2.2 类型 2.3 标…

Some/IP学习笔记

目录 1.概述 2.SOME/IP 报文格式 3.数据结构序列化 1.概述 SOME/IP全称为Scalable Service Oriented MiddlewarE Over IP,是车载以太网技术中的核心内容,它为网络提供了面向服务的通信方式。一个服务可以包含0个或者多个事件(events&#…

【C++ 学习 ㉟】- 异常详解

目录 一、C 异常处理的基本语法 1.1 - 抛出异常 1.2 - 检测和捕获异常 二、在函数调用链中异常栈展开的匹配原则 三、异常重新抛出 四、异常规范 五、C 标准异常体系 程序的错误大致可以分为以下三种: 语法错误:在编译和链接阶段就能发现&#xf…

Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作

vim简介、配置方案、常用模式的基本操作 本章思维导图: 注:本章思维导图对应的xmind和.png文件都已同步导入至资源 1. vim简介 vim是Linux常用的文本编辑器,每个Linux账户都独有一个vim编辑器 本篇我们介绍vim最常用的三种模式:…

史上最全最新Ubuntu20.04安装教程(图文)

总的来说,安装Ubantu包含以下三个步骤: 一、安装虚拟机 二、Ubuntu镜像下载 三、虚拟机配置 一、安装虚拟机 选择安装VMware Workstation,登录其官网下载安装包,链接如下: 下载 VMware Workstation Pro​www.vmwa…

Linux中字符设备的打开、写入

一个内核模块应该由以下几部分组成。 第一部分&#xff0c;头文件部分。一般的内核模块&#xff0c;都需要 include 下面两个头文件&#xff1a; #include <linux/module.h> #include <linux/init.h> 第二部分&#xff0c;定义一些函数&#xff0c;用于处理内核…

【Python大数据笔记_day07_hive中的分区表、分桶表以及一些特殊类型】

分区表 分区表的特点/好处:需要产生分区目录,查询的时候使用分区字段筛选数据,避免全表扫描从而提升查询效率 效率上注意:如果分区表在查询的时候呀没有使用分区字段去筛选数据,效率不变 分区字段名注意:分区字段名不能和原有的字段名重复,因为分区字段名要作为字段拼接到表后…

常见面试题-JDK和CGLIB动态代理

JDK 动态代理和 CGLIB 动态代理对比 JDK 动态代理只能代理实现了接口的类&#xff0c;而 CGLIB 可以代理未实现任何接口的类。另外CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用&#xff0c;因此不能代理声明为final 类型的类和方法就二者的效率来说&a…

信息系统项目管理师 教材目录、考试大纲、考情

文章目录 考情考试大纲第1章 信息化发展第2章 信息技术发展第3章 信息系统治理第4章 信息系统管理第5章 信息系统工程第6章 项目管理概论第7章 项目立项管理第8章 项目整合管理第9章 项目范围管理272第10章 项目进度管理297第11章 项目成本管理334第12章 项目质量管理358第13章…

【图像卷积与卷积层】的基本概念与区别

图像卷积 卷积操作是指将一个滤波器&#xff08;也称为卷积核或内核&#xff09;应用于输入图像的小块区域&#xff0c;然后将滤波器在整个图像上滑动&#xff0c;逐步计算出输出特征图。这个过程可以帮助网络学习到图像的局部特征&#xff0c;因为每个卷积核都可以学习到不同…

VulnHub Prime_Series_Level-1

一、信息收集 1.nmap扫描 ┌──(root&#x1f480;kali)-[~/桌面] └─# arp-scan -l┌──(root&#x1f480;kali)-[~/桌面] └─# nmap -sS -A -p- 192.168.103.202发现开放了22和80端口 2.web页面 打开80端口的web页面&#xff0c;是一张静态的图片&#xff0c;没什么价…

【Seata源码学习 】 扫描@GlobalTransaction注解 篇一

1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制&#xff0c;在应用上下文启动时&#xff0c;会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…

探寻知识的新路径——电大搜题助您开启学习新纪元

江西开放大学和广播电视大学一直以来都是许多自学者和职场人士追寻知识的圣地。然而&#xff0c;对于许多学子来说&#xff0c;学习的过程也常常充满了困惑和挑战。为了帮助这些学习者通过更高效、便捷的方式获取知识&#xff0c;江西开放大学推出了一款创新的学习工具——电大…

谈谈越来越无效的拥塞控制

简单看一个图&#xff1a; 它不是互联网本身&#xff0c;但这是典型网络的必要组件&#xff0c;它决定了 flow 如何从从一边流向另一边&#xff1a;一条 flow 经过交换节点通过 NIC 被导入一条链路前在 buffer 中排队。 现如今大多数工程师的工作都在折腾那个单独的盒子&…

231112-中文错别字识别与纠正问题的大模型与小模型调研

A. 引言 当前&#xff0c;以ChatGPT为代表的大语言模型&#xff08;Large Language Models, LLMs&#xff09;正引领着新一轮工业革命。ChatGPT最开始的研究领域隶属于NLP的一个子问题&#xff0c;其输入是text&#xff0c;输出也是text。在从文本输入到文本输出的诸多应用场景…

C语言从入门到精通之【概述】

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

Smart Link 和 Monitor Link应用

定义 Smart Link常用于双上行链路组网&#xff0c;提高接入的可靠性。 Monitor Link通过监视上行接口&#xff0c;使下行接口同步上行接口状态&#xff0c;起到传递故障信息的作用。 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个…

木疙瘩踩坑日记-容易忽略的一些BUG

在一开始玩家务必很清楚这三个概念 图形&#xff1a;舞台上元素的最小单位。软件自带的以及外部导入的图片默认都是图形&#xff01;最朴素的元素&#xff01;可以添加预制动画、关键帧动画、进度动画&#xff08;软件自带的形状&#xff09; 元件&#xff1a;一个可以内部封…