文件找不到!

简介: 谈文件异常前,先要给各位复习一下磁盘 IO 的知识,说到 IO,就不得不提一下计算机的存储系统体系,主要分为 CPU、内存、磁盘,而磁盘又分为机械磁盘和固态硬盘。一般来说,离 CPU 越近,价格越贵,速度越快,容量越小;反之,离 CPU 越远,价格越便宜,速度越慢,容量越大,见下图。

image.png


机械磁盘读写一般以毫秒为单位,并且顺序读写性能高于随机读写,有的同学可能会问为什么顺序读写的性能要好些呢?主要跟机械磁盘的结构有关系「见下图」,随机读写实际是要不断旋转磁头、扇区从而来找到对应的位置,因此性能较低。


image.png


在这里,我们可以联想到经常使用的数据库,它的耗时一般主要发生在查询的过程中,一般的调优也就是减少随机 IO 的次数。各位读者可以思考一下 MySQL 是怎么减少 IO 次数的呢?


对于固态硬盘来说,它是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元组成,没有机械旋转,因此,在性能上远超过机械硬盘。


下面来聊聊几个分析 IO 性能的工具。


首先,我们要知道磁盘的整体情况,才好对症下药,那么就离不开两个命令 fdisk df

image.png

image.png

从上图我们可以得出这台电脑的磁盘大小、有多少个扇区、每个扇区的大小以及使用了多少。


接着,我们需要分析 CPU 使用率、内存使用、虚拟内存交换、IO 读写情况等,如果是老读者的话,应该还记得我之前给各位推荐的牛逼工具  vmstat

image.png

如果你关注的点是服务器 IO 的读写性能,那么你主要关注 b、bi、bo 及 wa的值,如果读请求大,那么 b、bi 及 wa 的值会比较大,反之,如果写请求大,那么 b、bo 及 wa 的值会比较大。


最后,给各位介绍两款更加专业的工具 iostatiotop ,见下图你便知道它的牛逼之处了。

image.png

从上图中,我们可以看到每秒读写大小、tps 以及 CPU 的一些情况。


这里 iotop ,顾名思义,便是用于定位分析某个进程的 IO 状况使用的,见下图。

image.png


说完磁盘,咱们再说说文件,对于文件而言,主要就是文件权限、属性以及数据「它们存储在不同的地方」,见下图「来自网络」。

image.png


下图各各位展示一下整个 Linux 系统的目录结构。

image.png


对了,之前有读者问我怎么在 Linux 上判断一个文件是否是病毒?这里统一回答一下。


方法 1:可以直接比对文件的 MD5 值,或者直接把文件拿到在线病毒扫描网站上去扫一下。


方法 2:

用 file 命令快速识别文件类型 file bashd;

用 xxd 命令查看文件十六进制内容 xxd bashd | head   xxd bashd | grep socket;

用 strings 命令快速识别文件大体功能 strings bashd;

用 readelf 或 greadelf 命令继续深入挖掘文件信息  readelf -a bashd;




到这里,相信你应该对 Linux 的磁盘系统和文件都有所了解了。接下来给大家讲一下我们经常会遇到的一个异常 FileNotFoundException


该异常在 JDK 1.0 版本便存在了,扩展了 IOException,实现了序列化接口,取证见下图。

image.png


在什么情况下,会抛出该异常呢?


  1. 打开指定路径名失败时;
  2. 在只有只读权限的文件中写入;
  3. 该文件不允许任何程序读;


接着,依次举例来说明一下。

image.png


下图的代码实现读取一个文件的全部内容:

如果文件不存在,则会抛出:

image.png


下图的代码实现在文件的末尾添加一个字符串。

image.png

如果文件没有写入权限,则抛出:

image.png

如果文件是一个目录,则抛出:

image.png


如何处理 FileNotFoundException 呢?


  1. 验证指定的的文件或目录是否正确。
  2. 首先检查文件的权限是否正确,其次,检查该文件当前是否正在由另一个应用程序使用。
  3. 如果指定的文件是目录,则必须更改文件名或删除现有目录。


根据以往经验,在程序中,尽量使用绝对路径,少用相对路径。文件异常还是相对比较好排查的,但是 IO 性能的问题排查起来,就没有那么容易了。


如果喜欢我的文字,记得点赞或者转发给你身边的朋友。

相关文章
|
消息中间件 Java 中间件
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。接下来我就将从零开始介绍什么是消息队列?消息队列的应用场景?如何进行选型?如何在Spring Boot项目中整合集成消息队列。
23568 10
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
|
存储 缓存 监控
一文读懂分布式架构知识体系(内含超全核心知识大图)
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
19249 0
|
监控 Dubbo Java
超详细的Sentinel入门
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
超详细的Sentinel入门
|
容器 Kubernetes Perl
从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
作者| 阿里巴巴资深技术专家、CNCF 9个 TCO 之一 李响 一、什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。
18762 1
如何在 Java 中优雅地分割 String 字符串,鸭哥给你说透彻
如何在 Java 中优雅地分割 String 字符串,鸭哥给你说透彻
1455 0
如何在 Java 中优雅地分割 String 字符串,鸭哥给你说透彻
|
3天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
273 99
|
3天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;

热门文章

最新文章