好久没来CSDN了诶嘿o(≧v≦)o
事情的起因是这样的,最近在编写的Java程序,想要在crontab下定时运行。
稍微了解Linux的人都知道,Linux的crontab下运行程序的话,路径是一个容易坑的问题。crontab内的程序运行的路径不是程序所在的路径,这就造成一个麻烦的地方,假如jar包的位置并不确定,而jar包又需要读取同目录的文件,那么我能想到的比较快速的修补办法有:
(1)在crontab下运行jar包的指令前面,添加进入jar包目录的语句
(2)写一个shell脚本,在运行jar包前添加:cd `dirname $0`
唔嗯……从高内聚低耦合的角度来说,这样的修补办法让人觉得有些不舒服。于是,有没有什么办法,能让jar包读取它自身所在的绝对路径呢?
以下就是jar包获取自身所在文件夹的绝对路径的代码:
String jarWholePath = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getFile(); try { jarWholePath = java.net.URLDecoder.decode(jarWholePath, "UTF-8"); } catch (UnsupportedEncodingException e) { System.out.println(e.toString()); } String jarPath = new File(jarWholePath).getParentFile().getAbsolutePath();我来逐行解释一下这些内容吧:
第1行:
这一行获取了MyClass这个类所在的jar包的绝对路径。
举个例子来说,假如有一个名为MyClass的类,最后输出到了名为myJar.jar的jar包,该jar包现在放在C:\,那么这一行得到的内容就是:/C:/myJar.jar。
第2~4行:
这些行做了对jarWholePath这个String变量的转码。
如果路径完全是英语字符组成的,那么转码前后看起来是一样的;如果在路径中含有中文字符的话,那么这层转码就是必须的了,不转码就会让中文字符形成乱码。
第5行:
这一行获取了jar包所在的文件夹的绝对路径。
还是接着第1行的例子,这一行得到的结果是:C:/。
以上就是对这段小代码的解释。通过这段代码,我们就得到了jar包所在文件夹的位置,并且存储到了jarPath这个变量中。
写完之后还想讲两句闲话。
java的java.io.File类对文件操作和查看文件属性的功能还是比较完备的,一些常见的操作都可以直接调用函数。
像是这段小代码里最后一行,在通过new File(jarWholePath)得到一个File对象之后,对于文件的操作,包括获取绝对路径、获取上一级文件夹,等等,都可以任意调用函数。对于程序的快速开发,这是很好的帮助。