读取和写入文件都需要I/O操作调用系统提供的接口,因为磁盘设备是由系统来管理的,我们的应用程序要想访问物理设备只能通过这个方式。但是系统调用都是会涉及到内核空间地址和用户名空间地址的切换问题,原因是操作系统为了保护系统本身的运行安全,从而把内核程序运行使用的内存空间和用户程序运行的内存空间进行隔离造成的。这样做可以保证内核程序的运行安全,但是存在数据从内核空间向用户空间复制的问题。

如果遇到了比较耗时的操作,例如数据从磁盘到内核空间再到用户空间,就会变慢。这时候为了加速I/O访问,内核空间就会使用缓存机制来进行,就是说将从磁盘读出来的文件按照一定的方式进行缓存,如果我们的用户程序访问的是同一段磁盘地址的空间数据,那么直接返回给我们的就是缓存的数据,这样可以减小访问的响应时间。

接下来我们看看有几种文件访问方式吧

标准访问文件的方式

当应用程序调用到read()接口的时候,操作系统先检查内核的高速缓存中有没有需要的数据,如果有直接从缓存中返回,如果没有,则从磁盘中读取,然后存到缓存中。

当应用程序调用write()接口将数据从用户地址空间复制到内核地址空间的缓存中,这时候相对于应用程序来说写操作其实已经完成了,至于什么时候才写到磁盘里面去是由操作系统来决定的,除非是我们调用syns命令。

直接I/O的方式

直接I/O方式就是应用程序直接访问磁盘数据,二部经过操作系统内核数据的缓冲区,这样可以减少一次数据从缓冲区的复制。这种方式一般都是在对数据的缓存管理有应用程序实现的数据库管理系统中。在数据库管理系统中,系统很明确的知道应该缓存那些数据,应该让哪些数据失效,也可以对热点数据预加载,可以加速数据的访问效率。如果是让操作系统进行缓存,则会比较麻烦,因为系统并不知道,哪些是热点数据,哪些数据只需要访问一次就不用了,操作系统只是简单的缓存最近一次从磁盘读取的数据。

但是直接I/O方式也是存在负面的影响,如果我们想要的访问数据不在应用程序的缓存中,那么每次数据都会直接从磁盘进行加载,这种直接加载会非常缓慢。一般直接I/O与异步I/O结合使用会得到比较好的性能。

同步访问文件的方式

这种访问方式其实很好理解,就是读写操作是同步的,与标准访问文件的方式不同的是,只有当数据被成功写到磁盘时才返回给应用成功的标志。这种方式的性能比较差,只有在对一些数据安全性要求较高的场景中才会使用,一般这种操作方式的硬件都是定制的。

异步访问文件方式

异步访问方式是当访问数据的线程发出请求后,线程会接着去处理其他的事情而不是阻塞等待,当接收到请求的数据后继续处理下面操作,这种方式可以明显的提高应用程序的效率,但是事实上访问文件的效率并不会提升。

内存映射的方式

这种方式指的是操作系统将内存中的某一块区域与磁盘中的文件关联起来,当要访问内存中的某一段数据时,转换为访问文件的某一段数据。这样可以减少数据从内核空间缓存到用户空间缓存的数据复制操作,因为两个空间的数据是共享的。


大家好,我是一个程序员,对,就是你们认为的那种程序员,平时会写点文章,一个是可以再这个过程自己也学习并能巩固,第二也是可以跟大家分享一下,各位同是猿类的可以帮忙点关注,点点赞来支持一下你们搬砖路上的小伙伴,谢谢啦。

怎么访问和java包同级的文件_JAVA程序员谈几种访问文件的方式相关推荐

  1. system.img解包打包工具_好程序员云计算学习路线分享文件打包及压缩

    好程序员云计算学习路线分享文件打包及压缩 好程序员 建议针对目录 Demo: 复制未打包的文件到远程主机 [root@yangs ~]# du -sh /etc 39M /etc [root@yang ...

  2. java的xml面试题_Java程序员的10个XML面试问答

    java的xml面试题 XML面试问题在各种编程工作面试中非常受欢迎,包括针对Web开发人员的Java面试 . XML是一项成熟的技术,通常用作从一个平台传输数据的标准. XML面试问题包含来自各种X ...

  3. java run里面定义变量_Java程序员50多道最热门的多线程和并发面试题(答案解析)...

    下面是Java程序员相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...

  4. java必须掌握哪些知识_Java程序员必须掌握的知识

    1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项, ...

  5. Java业务面考什么_Java程序员面试技巧分享,面考官考查JAVA程序员常用的技术有哪些?...

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能呢?面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西. 大家可以把 ...

  6. minion java上传文件_Java程序员如何快速理解Kubernetes

    我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理.我们可以说我们希望他们成为我们的小黄人(minions).本文我们将通过一个简单的例 ...

  7. java里怎么实现播放文件_java程序,一步实现音乐文件的播放(小应用:听你想听)-nrg文件怎么播放...

    java学习分享 ~java完整代码如下~ package one; //包名随意 import java.awt.*; import java.applet.*; import java.awt.e ...

  8. java项目怎样提高性能_Java程序员成长之路(如何提高Java程序性能?)

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资 ...

  9. java技术栈有哪些_Java程序员必备的21个核心技术,你都掌握了哪些?

    前言 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容. ​1. JVM相关 对于刚刚接触Java的人来说,JVM相关的知识不一 ...

最新文章

  1. js最简单的几个特效_高阶函数不会用?教你JS中最实用的几个高阶函数用法
  2. IE浏览器中,设置指定程序查看源文件
  3. nginx忽略favicon.ico日志
  4. 查询Windows api
  5. js删除数组中的某一个元素
  6. iOS 获取屏幕的属性和宽度
  7. java after 函数_函数周期表丨信息丨值丨ISONORAFTER
  8. POI excel 添加水印 xls,xlsx
  9. 网络抓包工具Wireshark下载安装使用详细教程
  10. Google谷歌中国总裁李开复将离职创业
  11. Java语言 CRC-16/MODBUS..16+x15+x2+1校验码生成
  12. UVA10859 放置街灯 Placing Lampposts(树状DP)
  13. 【金猿产品展】Smartbi一站式大数据分析平台——一个平台、所有数据、无限可能。...
  14. php+时间戳+星座,php 根据日期显示星座的简单示例
  15. 西普实验吧CTF-约瑟夫环
  16. MySQL的左连接查询,只取出最大的一条数据
  17. 自制WordPress响应式主题-9IPHP 上线了~~
  18. LMS自适应滤波器算法及其改进
  19. ISO8601时间格式的转换
  20. IDEA快捷键 一张图片搞定

热门文章

  1. .dat文件还原数据库
  2. [原创]关于javax.servlet.ServletException: File [/loginController/getVerifCode.jsp] not found异常 解决方案
  3. 串口端口被占用的解决方法
  4. 解决大众点评换设备无法用卷(你本次购买不符合活动规则)的问题
  5. 解决vue中绝对定位或固定定位在底部的按钮随键盘移动的问题
  6. xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页,解决内容断开的问题
  7. 您是否应该始终偏爱xrange()而不是range()?
  8. Shell脚本调用mysql语句
  9. 【机器学习】逻辑回归(Logistic Regression)
  10. spring4 整合 mybatis3 配置文件