IO

同步IO和异步IO 阅读详情

1.文件系统操作

2.文件内容操作

1字节流

以字节为单位读写数据

InputStream

不能实例化,这个东西对应的不仅仅是文件、还有控制台、网卡等。

2字符流

以字符为单位读写数据

1)通过构造方法,打开文件

2)通过read方法读文件内容

3)通过write方法写文件内容

4)通过close方法关闭文件

Reader

Writer

构造方法填写参数:

1.填写字符串表示的文件路径(绝对/相对路径均可)

2.填写File对象

抛出异常IOExcepton的异常

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        File file=new File("D:/1");
        InputStream inputStream=new FileInputStream(file);
        inputStream.read();
       
    }
}

第一个是一个字节一个字节读,读取到的内容通过返回值表示,这里的返回值是int类型。

为什么是int类型呢?

从原则上来说,“字节”这样的概念,本身应该是“无符号”但是byte类型,本身有符号此处通过int类行就可以确保读出来的字节,都是正数,按照"无符号"的方式来处理了!

那为什么用short,而是用int?

但凡使用short的场景,都建议大家使用int.类似的,但凡使用float的场景,都建议大家使用double.

由于cpu一次性处理的字节数越来越多,这时候使用short,就还是要short转换为int来处理

第二个是一个字节组一个字节组的读byte[]

第二个版本,读到的数据往整个数组填充

        byte[]buffer=new byte[1024];
        inputStream.read(buffer);

输出型参数,先准备空数组,然后在方法执行完毕后,把读到的数据填写到byte数组中。

一次取多少取决于数组的长度(这里☞1024),read尽量把数组填满

返回值int,这次表示读取到多少个字节了

光标会回到首行,字符流,

字节就是utf8编码

字符流,基于字节流实现,

上述两个api中

read() 频次高,一次读东西少,下面的操作频次低,一个读的东西多。

read(bytes)低效操作次数越少,整体速度就越快

第三个也是字节组的读,但是第二个填入开始的位置,字节长度。

第三个版本,只能填充数组的一部分,从offset下标开始,最多填充len这么长.

关闭文件close

定时炸弹

打开文件.

打开文件的时候,会在操作系统内核,PCB结构体中,给文件描述符表”添加一个元素,这个元素就是表示当前打开的文件相关信息。当打开过多的时候

进程打开的文件会记录这个地方

文件描述符表,里面的长度存在上限,这个东西不能自动扩容。占满后,尝试打开,就会打开文件失败。就会类似于内存泄露成为文件资源泄露。

当执行close的时候,就会释放这个文件描述符表上对应的元素

文件描述表的长度有上限

可以用finally防止前面异常或者returrn,此时close就执行不到了

try {


                byte[] buffer = new byte[1024];
           int n= inputStream.read(buffer);
            for(int i=0;i<n;i++){
                System.out.println();
            }


        }finally {
            inputStream.close();
        }

 更加优雅,低耦合

 try (  InputStream inputStream=new FileInputStream(file);){


                byte[] buffer = new byte[1024];
           int n= inputStream.read(buffer);
            for(int i=0;i<n;i++){
                System.out.println();
            }


        }

OutputStream

版本一:一次write一个字节.参数是int类型

版本二:一次write若干字节.会把参数数组里所有的字节都写入文件中

版本三:一次write若干字节.把数组从offset下标开始,连续写len个字节.

按照写方式打开文件的时候,会把文件原有内容清空掉

(不是write清空的,而是打开操作清空的)

  OutputStream    outputStream=new FileOutputStream("D:/2/test.txt",true);
            outputStream.write(buffer);

            outputStream.close();

这样就可以实现追加写的方式了。

char用的时候unicode

String 里面则默认utf8.

比如当你写String s =“你好”s.charAt(1)=>char(好)

String内部是使用长度为6这样的byte数组来存储.

示例1

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件

前提:给定一个目录,给定一个查询词

写程序,搜索说,看哪个文件的名字里带有这个查询词把匹配的结果。

import java.io.File;
import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入搜索的目录");
        String rootPath = sc.next();
        System.out.println("输入查询的单词");
        String searchPath = sc.next();
        File root = new File(rootPath);
        if (!root.isDirectory()) {
            System.out.println("输入路径非法");
            return;
        }
        searchFile(root,searchPath);
    }
    private static void searchFile(File root, String searchPath) {{
    File[] files = root.listFiles();
    if (files == null) {
        return;
    }
    for (File file : files) {
        if (file.isFile()) {
        String fileName = file.getName();
        if (fileName.contains(searchPath)) {
            System.out.println(""+file.getAbsolutePath());
        } else if (file.isDirectory()) {
            searchFile(file,searchPath);
        }
        }
    }
    }
    }
}

示例2

复制一个文件

输入一个路径,表示要被复制的文件

输入另一个路径,表示要复制到的目标目录

import java.io.*;
import java.sql.SQLOutput;
import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入想要输入的文件路径");
        String srcpath = sc.next();
        System.out.println("请输入你想要复制的文件路径");
        String destpath = sc.next();
        File srcfile = new File(srcpath);
        if(!srcfile.isFile()){
            System.out.println("你输入的文件不合法");
            return;
        }
        File destfile = new File(destpath);
       if(!destfile.getParentFile().isDirectory()){//判断复制的文件的母类是否是目录,如果不是的话就说明他不合法,否则就是合法的
           //用getParentFile()返回的对象是File对象而getParentFile()返回的是字符串路径(String)
           System.out.println("输入的复制文件路径不合法");
            return;
       }
        try(InputStream inputStream = new FileInputStream(srcfile);
            OutputStream outputStream=new FileOutputStream(destfile)) //try结束的时候,自动close
            {
            while(true){
                byte []type= new byte[1024];
                int n=inputStream.read(type);
                if(n==-1){
                    return;
                }
                outputStream.write(type,0,n);
            }
        }  catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在此处考虑过文件不存在的情况,用的是

OutputStream outputStream=new FileOutputStream(destfile)由于OutputStream会在文件打开的时候自动创建文件所以就会解决这个问题,当然用createNewFile也是可以的,但是在此处只是画蛇添足的操作。

只有OutputStream可以在文件的不存在的时候创建文件而InputStream不可以

示例3

输入一个路径

在输入一个查询词

就会在这个路径中,文件内容,包含这个查询词这里的文件

import java.io.*;
import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入搜索的路径");
        String path=scanner.next();
        System.out.println("输入的查询单词");
        String searchWord=scanner.next();
        File file=new File(path);
        if(!file.isDirectory()){
            System.out.println("输入的路径非法");
            return;
        }
        search(file,searchWord);
    }
    public static void search(File file,String searchWord){
        File[] files=file.listFiles();
        if(files==null){
            return;
        }
        for(File f:files){
            if(f.isFile()){
                matchword(f,searchWord);
            } else if (f.isDirectory()) {
                search(f, searchWord);
            }
        }
    }

    private static void matchword(File f, String searchWord) {
    try (Reader reader = new FileReader(f)){
        StringBuffer stringBuffer=new StringBuffer();
        while (true){
            int c=reader.read();
            if(c==-1){
                break;
            }
            stringBuffer.append((char)c);
        }
        if(stringBuffer.indexOf(searchWord)>=0){
            System.out.println("找到了匹配结果路径是"+f.getAbsolutePath());
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    }
}

文件操作

文件系统操作

文件内容操作

串口接收完整一帧数据包的3种方法 本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行传输的,因此我们要在接收数据的同时判断当前接收的数据是否是完整的一帧。 一般串口完整数据帧的定义:帧头(2字节,例如AA、BB) + 数据长度(2字节) + 数据+ CRC16校验(2字节) + 帧尾(2字节) 帧头、帧尾表示一帧数据的开始和结尾,数据长度表示当前数据帧中负载数据大小,CRC16校... 阅读详情

相关推荐

EtherCAT主站开发(学习笔记一)

摘要:本文介绍了基于STM32H7的EtherCAT主站开发探索。EtherCAT是一种高实时性工业以太网协议,具有低延迟、高带宽利用率等特点。文章详细解析了EtherCAT的协议架构、帧结构和工作原理,重点阐述了PDO数据传输过程及主从站通信机制。同时介绍了CoE、FoE等应用层协议扩展。作者将基于SOEM开源协议栈进行开发,为后续实际应用中的伺服电机控制奠定基础。

weixin_69388007的博客 1473

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。本文是在《UNIX网络编程 卷1:套接字联网API》6.2节"I/O 模型 "的基础上,即UNIX/LINUX环境下的网络 IO环境下的理解,它里面给出的例子是读取(接收)网络UDP数据。下面简单写写自己对这些IO...

tjiyu的博客 3万+

苏州大学自动化考研842自动控制原理:手把手教你用胡寿松《自控》高效备考(附复试电工/电子/微机原理攻略)

本文详细解析苏州大学自动化考研842自动控制原理备考策略,以胡寿松《自动控制原理》为核心教材,提供三阶段高效学习路径和实战技巧。重点涵盖频域分析、根轨迹绘制等高频考点,并针对机电、光电、轨道三个学院的复试科目(电工电子技术、电子技术基础、微机原理与接口技术)给出差异化备考方案,助力考生全面提升笔试和面试表现。

weixin_42638178的博客 399

浅谈5种IO模型——阻塞式IO、非阻塞式IO、信号驱动IO、多路复用IO及异步IO

5种IO模型5种IO模型1、背景2、IO模型2.1、阻塞式IO(blocking IO)2.2、非阻塞式IO(nonblocking IO)2.3、多路复用IO(IO multiplexing)2.4、信号驱动IO(signal driven IO)2.5、异步IO( asynchronous IO)参考 5种IO模型 1、背景 从TCP发送数据的流程说起 要深入的理解各种IO模型,那么必须先了解下产生各种IO的原因是什么,要知道这其中的本质问题那么我们就必须要知一条消息是如何从过一个人发送到另外一个人的;

JMW1407的博客 8309

5.3 磁悬浮轴承:基于有限元法的电磁场分析

摘要:本文系统阐述了有限元法在磁悬浮轴承电磁场分析中的应用。相较于等效磁路法和解析法,有限元法能精确处理复杂几何、材料非线性和动态效应。重点介绍了三维静磁场仿真(用于计算稳态磁场、电磁力和电感)和瞬态磁场仿真(用于分析动态过程和损耗)的关键设置与后处理方法。通过有限元分析可验证承载力、评估损耗分布并指导结构优化,形成"磁路设计-有限元验证-参数修正"的闭环设计流程,为磁轴承的精确设计和性能评估提供可靠依据。

技术工作者 1290

目标检测中的困难样本挖掘:YOLOv5训练效果提升30%的秘诀

本文深入探讨了目标检测中困难样本挖掘的关键技术,特别是如何通过在线困难样本挖掘(OHEM)策略显著提升YOLOv5模型的性能。文章详细解析了困难样本的分类、识别机制及实战配置,并提供了数据标注策略与增强技巧,最终实现模型性能提升30%的突破。

weixin_30379531的博客 401

【IO】什么是IO、标准IO、文件IO

IO是计算机中的输入/输出(Input/Output)的简称,指的是之间进行数据交换的过程。输入是指将外部数据传输到计算机系统中,输出是指将计算机系统中的数据传输到外部设备中。在计算机中,输入可以来自多种来源,如键盘、鼠标、触摸屏、传感器等。输出可以发送到显示器、打印机、扬声器、存储设备等。IO操作是计算机系统中的重要组成部分,它使计算机能够与用户交互,接收用户的输入,并将计算结果输出给用户。通过IO操作,计算机可以读取外部数据、存储数据、显示信息、传输数据等。

m0_56844552的博客 5662

西门子S7-1200与汇川SV660F伺服Profinet通讯调试实战

在工业自动化领域,Profinet作为工业以太网标准协议,凭借其高实时性和灵活组网能力,已成为伺服驱动器与PLC通讯的主流选择。其核心原理是通过设备名识别、IP分配以及标准报文(如111速度报文、105定位报文)传输控制字与状态字,实现驱动器的精准控制。相比传统脉冲或CANOpen方案,Profinet直连省去了协议转换网关,降低了成本与故障点,尤其适用于绕线设备、包装机械等中小型单轴或多轴运动控制系统。本文以西门子S7-1200 PLC搭配汇川SV660F伺服为例,完整梳理了从GSDMD组态、InoDri

weixin_29184371的博客 223

同步IO、异步IO以及五种网络IO模式

当用户进程调用了select,那么整个进程就会被block,而同时,kernel会 “监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。很显然,这种IO模型是同步的。有一天,学校里面优化了热水的供应,增加了很多水龙头,这个时候小明同学再去装水,舍管阿姨告诉他这些水龙头都还没有水,你可以去忙别的了,等有水了告诉他。: 小明去打开水,而开水塔此时没有水,开水塔的阿姨叫小明把水壶放到现场,来水后会帮他打好水,并打电话叫他来取,这是异步IO的一种案例。

m0_65635427的博客 2572

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1745

基于TIA博途的一阶滞后滤波+中位值滤波+堆栈平均值滤波算法SCL语言程序(封装FB库)

基于TIA博途的一阶滞后滤波+中位值滤波+堆栈平均值滤波算法SCL语言程序(封装FB库)

Robot_PLC_HMI_Automation 2177

【网络】高级IO——五种IO模式

我们在本专栏前面的文章中大概学习了TCP/IP四层模型,因为我们不学网络,所以那些知识也是够用的。我们接下来要回归到我们的应用层的学习——也就是写代码。接下来,我们在接下来的学习中将学习以下内容理解五种IO模型的基本概念,重点是IO多路转接掌握select编程模型,能够实现select版本的TCP服务器掌握poll编程模型,能够实现poll版本的TCP服务器掌握epoll编程模型,能够实现epoll版本的TCP服务器理解epoll的LT模式和ET模式,

2301_80224556的博客 3577

insightface scrfd人脸检测测试

pip install mmdet 自动安装mmcv win10上可以,服务器上没成功

jacke121的专栏 4022

阻塞IO、非阻塞IO的区别

1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合。 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值。 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现。 3)继承 即 泛化(实线加空心三角形,从子类指向父类):表示一个类与另一个类之间的继承关系; 4)关联(实线):一个类是另一个类的成员变量。 5)聚合(菱形加实线):整体和部分的关系。不太紧密的(如:汽车与发

yyxyong的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

五种 IO 模型与非阻塞 IO

本文介绍了五种IO模型及其核心概念,阐述了不同IO模型的特点与应用场景。

Edison's 小宇宙 4万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux 【C编程】IO进阶— 阻塞IO、非阻塞IO、 多路复用IO、 异步IO

本文主要讲了Linux的高级IO操作,阻塞IO与非阻塞IO,多路IO复用与异步IO

weixin_46999174的博客 1869

阻塞IO与非阻塞IO

学习地址:https://www.cnblogs.com/xiaoxi/p/6525396.html 在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。 1、阻塞IO模型   最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。   当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用...

qq_34638435的博客 4万+

五种 IO 模型 (异步IO同步IO)

任何 IO 过程中, 都包含两个步骤. 第一是等待, 第二是拷贝.IO=等待+拷贝而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让 IO 更高效, 最核心的办法就是让等待的时间尽量少.即单位时间内,IO等待时间的比重越低效率越高。I/O 模型等待方式等待时间长短CPU 利用率适用场景阻塞 I/O(Blocking I/O)等待recv()返回长(进程完全被阻塞)低(进程无法做其他任务)小规模应用非阻塞 I/O(Non-blocking I/O)recv()轮询数据中。

wws7920的博客 917

五种IO模型和阻塞IO

五种IO模型和阻塞IO

Xpccccc的博客 1255

同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

同步IO与异步IO的区别? 1.POSIX 2.IO模型 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO模型 异步IO模型 五种IO模型比较

zhuguanlin121的博客 883

Linux 五种IO模型总篇(阻塞IO、非阻塞IO、信号驱动IO、多路复用IO(select、poll、epoll)、异步IO)

IO(Input Output)简单来说就是和,当底层数据没有就绪时,等待数据就绪,当数据就绪时就拷贝数据到上层。对于怎么等和拷贝的问题,衍生出了五种IO模型,。前四种IO是,多路复用/多路转接IO是异步IO。信号IO是同步还是异步,具有一定争议。但普遍认为,所以信号IO也是同步IO。IO的同步、异步的概念与线程不同,这里的指的是指的是。。对于来说,它的高效体现在IO,其他的IO模型高效在。每一种IO,都有其对应的使用场景,没有说哪一种IO模型在任何情况下都完胜另一种IO模型。

laimaxgg 1539

五种IO模型与阻塞IO

五种IO模型与阻塞IO

zgwnb666的博客 1576

磁盘IO和网络IO

4、IO访问方式 4.1 磁盘IO 具体步骤: 当应用程序调用read接口时,操作系统检查内核缓冲区中是否存在需要的数据,如果存在,就直接从内核缓存中直接返回,否则从磁盘中读取,然后缓存至操作系统的缓存中。 当应用程序调用write接口时,将数据直接从用户地址空间复制到内核地址空间的缓存中,这时对用户程序来说,写操作已经完成了,至于什么时候写入磁盘中,...

泷泷养的乔小胖 5398

高级IO——五种IO模型

大致介绍了五种IO模型

weixin_74074953的博客 1303

【IO】IO模型:Linux下的五种IO模型

Linux 提供了五种 IO 模型,包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。 在unix操作系统中,一个IO操作主要经过两个阶段:1、等待数据准备;2、将数据从内核空间拷贝到用户进程中。示意图如下: 1.阻塞 IO 模型 Linux操作系统中,这就是一种最简单的IO模型,即阻塞IO。一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。 当用户线程发出 IO 请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于

A minor 1953

五种IO模型- 阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO

在操作系统中处理输入/输出(IO)操作的过程中,存在多种方式,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。这些方式在操作系统实现和应用程序编写时有着不同的适用场景和性能特征。接下来,我将逐一介绍它们的实现原理、优缺点以及应用场景,同时给出Java和Python的实验示例。

AI大模型/Python/Java/MySQL技术栈,快来和我一起学习吧 ~ 1307
上一篇: HashTable, HashMap, ConcurrentHashMap 之间的区别
下一篇: 网络初识
鱼裤
博客等级 码龄4年 678粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值