艹,文件找不到!

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

5dbf400dbe84ae58d749548dafaf9fbdd8d1d49b

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

89bb236e2bc2b3336971286b82d4ebdd5118fb7d

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

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

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

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

256d9e021498353aa5df18dbbd402312e5cca008

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

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

75b3b86b27e6aef1e0ea37b8cd6f65d6ff67bece

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

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

14b7e97e0b4966a9c7478d69610dbb37fad882c2

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

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

3ece84843f8acc0d30b6d58bd77db5f49db28ad2

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

876845ac293777249be9b043b130d00308397cbd

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

de5597c9450e729ec7a6f8ab60c823f5db741ef3

对了,之前有读者问我怎么在 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,实现了序列化接口,取证见下图。

19422018b0842394e708282165b13af2593c7a9f

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

  1. 打开指定路径名失败时;

  2. 在只有只读权限的文件中写入;

  3. 该文件不允许任何程序读;

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

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

673e2e2a1b316abd68b525674d58f91a89ee756c

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

cd9fa490c6197a6f4141b19064dcac513be9df1f

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

daaa3982dfcfcfdd76e90a008319a989572a8e27

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

f8ae2f4a23659fee2ab883b1196362f725920b91

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

c90b9a6152f34a7e8d65ee8beb11d337305908b5

如何处理 FileNotFoundException 呢?

  1. 验证指定的的文件或目录是否正确。

  2. 首先检查文件的权限是否正确,其次,检查该文件当前是否正在由另一个应用程序使用。

  3. 如果指定的文件是目录,则必须更改文件名或删除现有目录。

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


原文发布时间为:2018-09-18
本文作者: Java面试那些事儿
本文来自云栖社区合作伙伴“ ”,了解相关信息可以关注“Java面试那些事儿”。

相关文章
|
8月前
|
Linux Python Windows
Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。
Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。
52 0
|
4天前
|
机器人
leetcode代码记录(不同路径 II
leetcode代码记录(不同路径 II
8 0
|
4天前
|
机器人
leetcode代码记录(不同路径
leetcode代码记录(不同路径
11 0
|
4天前
|
程序员 C++
开心档之 C++ 引用
开心档之 C++ 引用
|
9月前
怎么删除360base64.dll,这个方法百分百管用
怎么删除360base64.dll,这个方法百分百管用
225 0
|
9月前
|
程序员
有了这些不愁找不到对象,520表白代码
有了这些不愁找不到对象,520表白代码
52 0
|
11月前
|
编译器 开发工具 Windows
VS2008 未找到编译器可执行文件 csc.exe【当网上其他方法试玩了之后不起作用的时候再用这个方法】
被公司派遣到中国海洋石油惠州炼化公司做项目,做的是生产管理,来了发现他们的项目结构简直烂的要命,和同学们写的毕业设计差不多,然后开发工具用的是vs2008,我电脑是安装了vs2005和vs2010,vs2012就是没有安装vs2008,在安装vs2008的时候那是一番折腾好长时间,然后把vs2008安装好了打开项目代码,生成解决方案发现报了好多错,然后一一解决,最奇怪的是VS2008 未找到编译器可执行文件 csc.exe,我把所以路径都配好了,并且在dos环境下执行csc.exe都可以执行,环境变量路径设置的也么有问题,就是很奇怪重启机子打开项目还是找不到csc.exe
150 0
|
12月前
|
安全 程序员 C++
开心档之C++ 引用
【摘要】 C++ 引用引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。C++ 引用 vs 指针引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间...
|
开发工具 git
找不到.gitconfig文件具体位置时的解决方法
找不到.gitconfig文件具体位置时的解决方法
556 0
|
C++
VS代码中明明有NO_BITMAP字串,提示找不到
VS代码中明明有NO_BITMAP字串,提示找不到
68 0