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);
    }
    }
}

文件操作

文件系统操作

文件内容操作

在Ubuntu 22.04上从零搭建TrinityCore 3.3.5服务器:一份保姆级避坑指南 本文详细介绍了在Ubuntu 22.04系统上从零搭建TrinityCore 3.3.5服务器的完整流程,包括环境准备、源码编译、数据库配置、资源文件处理及性能调优等关键步骤。特别针对国内开发者和低配置用户优化,提供保姆级避坑指南,帮助用户高效搭建魔兽世界经典旧世版本私服。 阅读详情

相关推荐

从零开始:使用Labelme完成图像语义分割标注全流程

本文详细介绍了如何使用Labelme工具完成图像语义分割标注的全流程,从环境安装、数据准备到核心标注操作,并重点讲解了如何将标注结果转换为PASCAL VOC等深度学习框架可用的标准数据集格式。文章还提供了关键的避坑指南和高效技巧,帮助初学者快速上手,高效产出高质量的标注数据。

weixin_29073241的博客 491

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万+

避开这些坑!海天MA1600注塑机数据采集项目经验分享

本文分享了海天MA1600注塑机数据采集项目的实战经验。针对KEBA控制器接口不开放的难题,项目采用专用网关进行协议转换,并详细剖析了网络部署、ModbusTCP配置、数据准确性保障及现场运维中遇到的典型陷阱与解决方案,为同类工业物联网项目提供宝贵参考。

o4p5q6r7s的博客 490

浅谈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

完美解决LBP2900打印机安装驱动提示无法识别USB及连接错误等问题(附Win11全新安装支持及卸载方案)

LBP2900打印机虽然经典老旧,但在Win11上依然可以完美使用!许多网上教程都无视安装失败后的问题,在此分享一种全新、100%有效的方法来解决驱动连接错误和无法识别USB设备的问题。无论是新安装还是卸载重装,这个方法都适用。本文整合了通用驱动包,支持Win2000到Win11系统,操作简单,轻松摆脱安装困扰,享受无忧打印体验!

心开始の未来~的博客 2万+

NWD 格式转换 STL 全流程:专业方案与迪威模型网在线转换详解

在3D模型处理中,将NWD文件转换为STL格式是常见的需求,特别是在3D打印和计算机辅助制造等领域。NWD文件由Autodesk开发,主要用于建筑、工程和施工行业,包含丰富的几何图形和材质信息,但因其专有格式和大文件大小,限制了其应用范围。相比之下,STL格式广泛应用于3D打印,仅包含表面几何信息。转换NWD到STL的原因包括拓展模型应用场景和便于模型编辑。转换方法包括使用专业软件如Autodesk Navisworks配合Blender或3ds Max,或使用专门的转换工具如CADExchanger。

技术说明博主 2539

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

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

m0_56844552的博客 5662

从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程

本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。

weixin_29313547的博客 672

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

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

m0_65635427的博客 2572

使用CNN/ResNet实现自动调制识别(RML2018.01a)

本文基于RML2018.01a大型数据集,给出CNN及其变体ResNet的信号识别的实现方式(附代码) 目录一、CNN的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 构建CNN模型1.4 模型训练1.5 测试及模型可视化二、ResNet的代码实现 RML2018.01a数据集信息如下: 数据集来源 Over-the-Air Deep Learning Based Radio Signal Classification 调制类型 19种数字调制方式: 32PSK, 16APSK,

QAQIknow的博客 1万+

使用 MATLAB/Simulink + Simscape Electrical + SimPowerSystems + Stateflow,构建一个多能互补微电网系统的动态响应仿真模型

本文详细介绍了使用MATLAB/Simulink构建多能互补微电网动态响应仿真模型的方法。文章从系统架构设计入手,包含光伏、风电、柴油发电机、锂电池储能等多种组件,重点讲解了建模过程、控制策略(下垂控制、PLL、SOC管理)和模式切换逻辑(Stateflow)。通过四种典型场景(负荷突增、光伏出力骤降、并网/孤岛切换、电动机启动)的仿真分析,验证了微电网在动态响应中的关键性能指标,并提出了高可靠性设计建议。该模型为微电网的稳定性分析和优化设计提供了有效工具,特别强调了储能系统在快速功率支撑中的重要作用。

amy_mhd的博客 159

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

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

2301_80224556的博客 3577

OSCP-Algernon(SmarterMail)

从前面的结果中,确实有.NET远程处理在端口17001上运行。因此,此漏洞应适用于目标计算机。下载了漏洞并编辑了以下部分以匹配我的IP并使用本地端口21。端口9998引导到一个SmarterMail的登录页面。设置监听,获得一个反弹shell。端口80重定向到默认IIS页。已经是system权限了。google搜索漏洞。

墨痕诉清风的博客 488

阻塞IO、非阻塞IO的区别

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

yyxyong的博客 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

五种 IO 模型与非阻塞 IO

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

Edison's 小宇宙 4万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

weixin_46999174的博客 1869

jre9下载 jdk9

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

阻塞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、付费专栏及课程。

余额充值