文件 I/O 指的是对文件的输入/输出操作,就是对文件的读写操作;Linux 下一切皆文件,文件作为 Linux 系统设计思想的核心理念,在 Linux 系统下显得尤为重要,所以对文件的 I/O 操作既是基础也是最重要的部分...一个通用的 IO 模型通常包括打开文件、读写文件、关闭文件这些基本操作,主要涉及到 4 个函数:open()、read()、write()以及 close()。...文件IO tips:我们在 Linux 系统下,可以通过 man 命令查看某函数的用法和帮助信息以及头文件引用信息。...int flags); int open(const char *pathname, int flags, mode_t mode); 在 Linux 内核提供的标准文件 IO 中,主要以文件描述符fd...> ssize_t read(int fd, void *buf, size_t count); 关闭文件 #include int close(int fd); 标准IO
1.3 open/close 首先了解一下文件描述符,和文件描述符表。 注意:以下内容记住基于进程,所以文件描述符和符表都存在PCB里面了。 文件描述符表:纪录文件描述符使用情况的表。...之后再开辟新文件就会生成新的文件描述符,默认使用空闲的最小的文件描述符。...O_CREAT 若文件不存在则创建,仅此处会用到第三个参数,赋予文件权限 O_EXCL 和 O_CREAT 共用,如果文件已存在则出错返回 O_TRUNC 这个咱也没用过,如果文件已存在,并且有可写模式打开...参数释义:fd文件描述符 offset:偏移量 whence:偏移的起始位置 whence: SEEK_SET:从文件开始处计算 SEEK_CUR:从当前文件偏移处计算 SEEK_END:从文件结束处计算...1.7 fcntl 可以用fcntl对一个已打开的文件进行修改属性,而不必重新open一个文件 不过这个我是没试过了 不过文件锁需要用到这个 Linux中文件记录锁可以对文件某一区域进行文件记录锁的控制
Hi~朋友,关注置顶防止错过消息 文件IO的分类有哪几种? 缓冲与非缓冲IO 直接与非直接IO 阻塞与非阻塞 同步与异步IO 缓冲与非缓冲IO的区别?...根据是否利用标准库缓冲,可以把文件IO分为缓冲IO和非缓冲IO: 缓冲IO,利用标准库的缓存实现文件的加速访问,标准库再通过系统调用访问文件 非缓冲IO,直接通过系统调用访问文件,不经过标准库缓存 缓冲...直接和非直接IO的区别?...根据是否利用操作系统的缓存,把文件IO分为直接IO和非直接IO: 直接IO:不会发生内核缓存和用户程序之间的数据复制,而是直接通过文件系统访问磁盘 非直接IO:读操作时,数据从内核缓存中拷贝给用户程序,...非阻塞IO本质上还是同步IO,因为在执行read调用时,内核将数据拷贝到应用程序空间还是需要等待的,如果内核实现的拷贝效率不高,read调用会等待很长时间。 阻塞IO和非阻塞IO是同步IO么? 是。
有人总是以为所谓的文件指针就是一个指向文件的指针,其实文件指针是一种指向类型为FILE结构体的指针,只不过这个结构体内部包含了代表文件的描述符而已。...拓展: 文件指针是这么获取的: FILE *fp = fopen("example.txt", "r"); 其中,FILE结构体如下所示: ?...在上述结构体中,有个叫_fileno的核心成员,该成员就是由open()获得的文件描述符,可见标准IO函数fopen()本质上也是对系统IO的封装,它们的关系如下图所示: ?
不同模式打开文件的完全列表: 模式 描述 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。...r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。...如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。...如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。...如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。...文件指针将会放在文件的开头。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。...如果该文件不存在,创建新文件。 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。...如果该文件不存在,创建新文件。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。...如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
一、什么是文件 此处谈到的文件,本身有多重含义 狭义的文件,特质硬盘上的文件(以及保存文件的目录) 目录就是平时所说的“文件夹”,专业术语叫“目录”,目录也是属于文件 广义的文件,计算机上的很多硬件设备...” 一般是通过“文件资源管理器”这个程序,观察到文件系统管理的文件,就是“此电脑” 文件系统上的目录结构,是一个“树形结构”,不是二叉树,是“N叉树” 基于上述的结构,我们就可以找到某个文件在电脑上的具体位置...(操作系统版本,第三方库,配置文件,其他目录文件,硬件设备…) 四、文件类型 文本文件(.txt/.c/.java) 当前文件里存储的所有内容都是“文本”(合法的字符) 虽然叫做文本文件,本质上内部存的还是二进制...quote] 字符编码方式(字符集) 中文 UTF8/GBK,字符编码都是很大的“表格” 一个简单粗暴的方式,判断是什么文件: 直接使用记事本打开这个文件,不是乱码,就是文本文件,否则就是二进制文件...虽然文本文件底层仍然是二进制存储,Jav 啊把文本文件取出来的时候,自动查询码表,把二进制内容一个个转换成字符。而二进制文件则没有上述的转换过程
读文件、写文件,都是操作系统提供了 API,在 Java 中也进行了封装,叫“文件流”/“IO流” Stream 流,形象比喻,水流/气流 水流的特点:我要通过水龙头,接 1000ml 水...直接一口气,把 1000ml 接完 一次接 500ml,分两次接完 一次接 100ml,分十次接完 … IO 流的特点:我要从文件读取 100 字节文件 直接一口气,把 100 字节读完 一次读...50 字节,分两次读 一次读 10 字节,分十次 … 操作系统本身提供的文件读写 API 就是流式 Java 实现 IO 流,类有很多,主要分为两个大类: 字节流和字符流 字节流:二进制文件使用...读文件 在文件打开之后,就需要读文件了 import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream...读文件 为了方便处理字符,引入字符流 一次读一个字符: import java.io.FileReader; import java.io.IOException; import java.io.Reader
Scala 进行文件写操作,直接用的都是 java中 的 I/O 类 (java.io.File): import java.io._ object Test { def main(args:...实例如下: import scala.io._ object Test { def main(args: Array[String]) { print("请输入菜鸟教程官网 : " )...从文件读取内容非常简单。...我们可以使用 Scala 的 Source 类及伴生对象来读取文件。...以下实例演示了从 "test.txt"(之前已创建过) 文件中读取内容: import scala.io.Source object Test { def main(args: Array[String
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程: #1. 打开文件,得到文件句柄并赋值给一个变量 #2. 通过句柄对文件进行操作 #3....关闭文件 二、打开文件的方法 ① f = open('文件名' , '操作模式' , ‘编码格式’) 如: f = open('test.txt','r',encoding='utf-8') 注意:用这种方法打开文件...='utf-8') as f: 注意:用这种方法打开文件,处理完后会自动关闭文件,但是处理的段落要进行缩进 三、操作文件的几种模式 ?...四、处理文件的几种方法 示例文件如下: ?... truncate() 此方法是截取文件,注意,是直接对原文件进行截取。
Linux文件分类: 普通文件:用户和OS的数据,程序等信息文件 目录文件:Linux文件系统将文件索引节点号和文件名同时保存在目录中,所以目录就是一张表。...OS可以修改目录文件,用户只能读目录文件 设备文件:Linux下一切皆文件,设备也是文件。每一种I/O设备对应一个设备文件,存放于/dev下。...-:表示普通文件 d:表示目录文件 l:表示链接文件 c:表示字符设备 b:表示块文件 p:表示管道文件 f:表示堆栈文件 接着看第一个符号后面的信息,注意到后面仍旧有9个字符。...Linux文件描述符 在Linux下当一个进程打开文件的时候,OS会返回相应的文件描述符,程序为了处理该文件必须使用这个文件描述符。文件描述符是一个正整数。...另外lseek的文件偏移量的大小可以大于当前文件的长度,在这种情形下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞。文件空洞并不要求在磁盘上占据空间。
一、先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。...也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。...因此,Linux 下既可以使用标准I/O,也可以使用文件I/O)。 通过文件I/O读写文件时,每次操作都会执行相关系统调用。...这样处理的好处是直接读写实际文件,坏处是频繁的系统调用会增加系统开销,标准I/O可以看成是在文件I/O的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数。...文件I/O中用文件描述符表现一个打开的文件,可以访问不同类型的文件如普通文件、设备文件和管道文件等。而标准I/O中用FILE(流)表示一个打开的文件,通常只用来访问普通文件。
失败则返回-1 第三个参数写成/*mode_t mode */ 表示这个参数仅在创建新文件时使用 Pathname表示要打开或者创建文件的名字 Oflag可用来说明此函数的多个选项。...下面的常量是可选的 O_APPEND 每次写时都追加到文件的尾端 O_CREAT 若此文件不存在则创建它,使用此项时需要第三个参数mode O_EXCL 可以测试文件是否存在,若不存在则创建...有可能在close和fcntl之间插入执行信号捕捉函数,它可能修改文件描述符 2.dup2和fcntl有某些不同的errno 8 延迟写 当数据写入文件时,先将数据复制到缓冲区中。...延迟写减少了磁盘读写,却降低了文件内容的更新速度次数,使得欲写到文件中的数据在一段时间内没写到磁盘上,如果系统发生故障,可能造成文件丢失 #include int fsync(int...,将所有修改过的块缓冲,排入写队列,但是不等待写完成即返回;fsync只对文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束;fdatasync类似于fsync,但它只影响文件的数据部分
例如: fwrite、fread、fopen、fclose、fseek、fflush ---- 文件系统接口 文件系统——一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问...标准文件访问方式 ---- 直接IO方式 OPEN +O_DIRECT = 绕过内核缓冲区的直接访问,有效避免了CPU和内存的多余时间开销。要求内存边界对齐。...注意:直接IO的缺点就是如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘进行加载,这种直接加载会非常慢,通常直接IO跟异步IO结合使用会得到较好的性能。...\n"); if (buf)free(buf); close(fd); return 0; } ---- 直接IO和标准方式进行对比 **示例:**测试20s内对同一文件的读取次数0 #define...---- Linux文件IO流程图 内核中会有一个线程,不断地将高速页缓冲区中的数据写入到物理磁盘中。
bad()方法将返回true 读取文件的时候如何知道读取到了文件的末尾 可以用eof来判断最后一次读取是否遇到EOF即文件的末尾 是则返回true 妈,那么判断末尾的的方法我们已经知道了 我们该如何知道文件在当前文件的哪个位置...我们之前在C++语言中也提到了文件指针的这个概念 这里再来复习一下可以说是 文件指针可以理解为文件内部记录读取或者写入的当前位置 每次程序在读写文件时,磁盘中的文件指针就会向后移动一个字节 文件流提供以下成员函数来读取或配置文件指针...ios::beg 从文件头开始计算偏移量 ios::end 从文件末尾开始计算偏移量 ios::cur 从当前位置开始计算偏移量 通过这些成员函数我们就可以修改这些文件指针达到在我们需要的位置进行读写文件...运行截图 tellp会返回当前写入文件的指针位置 也就是24 写文件写入的话会从24的位置继续写入 我们现在设置一下写入文件的文件指针 通过seekp成员函数 可以看到我们将写入文件的指针设置为...0 则下一次写入文件的操作将会从文件0的位置开始写入 可以看到 我们将标志改到尾部 然后设置偏移量为0 表示从尾部加入 现在我们开始读文件 我们发现在使用>>进行读文件时 遇到空格和回车会自动停止读取
前言 友友们大家好,我是你们的小王同学 今天给大家带来的是 JAVA IO——文件拷贝 希望能给大家带来有用的知识 小王的主页:小王同学 小王的gitee:小王同学 小王的github:... 和 输出流来把我们的这张图片 拷贝到d盘 具体的流程 代码如下: package com.wxz.File; import java.io.FileInputStream; import java.io.FileNotFoundException...; import java.io.FileOutputStream; import java.io.IOException; public class FileCopy { public static...然后把路径改到d盘即可~ package com.wxz.File; import java.io.FileInputStream; import java.io.FileNotFoundException...; import java.io.FileOutputStream; import java.io.IOException; public class FileCopy { public static
如果文件已有内容,这次打开文件所写的数据附加到文件的末尾 而不覆盖原来的内容。 * O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该 文件的访问权限。...注意open函数与C标准I/O库的fopen函数有些细微的区别: 以可写的方式fopen一个文件时,如果文件不存在会自动创建,而open一个文件时必须 明确指定O_CREAT才会创建文件,否则文件不存在就出错返回...以w或w+方式fopen一个文件时,如果文件已存在就截断为0字节,而open一个文件时必 须明确指定O_TRUNC才会截断文件,否则直接在原来的数据上改写。...例如,首先调用close关闭文件描述符1,然后调用open打开一个常规文件, 则一定会返回文件描述符1,这时候标准输出就不再是终端,而是一个常规文件了,再调用 printf就不会打印到屏幕上,而是写到这个文件中了...后面要讲的dup2函数提供了另外一种 办法在指定的文件描述符上打开文件。
文件系统 文件描述符 一个进程默认打开三个文件描述符 STDIN_FILENO 0 STDOUT_FILENO 1 STDERR_FILENO 2 新打开文件返回文件描述符表中未使用的最小文件描述符...const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 返回值:成功返回新分配的文件描述符
File类 File 类 是 java.io 包中唯一代表磁盘文件本身的对象 File(String dirPath) 构造生成 File 对象 import java.io.File; class...RandomAccessFile类 随机跳转到文件的任意位置处读写数据,该类仅限于操作文件 import java.io.File; import java.io.RandomAccessFile; import...流的子类 进行字节、字符的读写操作 关闭文件流 3.1 字节流 import java.io.*; class IoDemo { public static void main(String...; import java.io.PipedInputStream; import java.io.PipedOutputStream; class Sender extends Thread{...字符编码 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream
, 文件的IO操作设置为非阻塞模式; int oflag 同步参数可选常量解析 : -- O_DSYNC : 每次 write 操作之前等待 IO 完成, 如果写操作不影响读取刚写入的数据, 则不等待文件属性被更新...; -- O_RSYNC : 读操作时等待, 直到所有的写操作都完成; -- O_SYNC : 每次写都要等待物理 IO 操作完成, 包括 write 引起的文件属性更新; 即 数据和属性同步更新; 2...; (2) 文件偏移量简介 文件偏移量 : -- 当前文件偏移量 : 每个打开的文件都有一个当前文件偏移量, 非负整数, 从开始处计算的字节数; 读写操作都是从当前文件偏移处开始, 读写会使当前文件偏移量增加.../a.out 该文件可以执行 lseek 方法 (5) 文件空洞 文件空洞形成 : -- 文件偏移量作用 : 文件偏移量是记录在内核中, 不引起 IO 操作, 这个偏移量主要用于执行下一次的 IO...操作; -- 空洞形成 : 如果文件偏移量大于当前文件长度, 下一次写操作会直接加长文件, 并在中间形成一个 "文件空洞"; -- 磁盘占用情况 : 文件空洞是不占用磁盘存储区的, 写入数据超出文件长度时
领取专属 10元无门槛券
手把手带您无忧上云