一、使用File#renameTo(File)
方法移动文件可能失败
使用File#renameTo(File)
方法移动文件可能失败,查看该方法的JavaDoc,发现失败原因可能如下:
- 移动到不同文件系统
- 目标文件已经存在
- …
因此,File#renameTo(File)
方法逻辑上不等价于mv
命令,“commons-io”包中实现有一系列移动文件的鲁棒性方法(逻辑上等价于mv
命令):moveDirectory(File srcDir, File destDir)
,moveDirectoryToDirectory(File src, File destDir, boolean createDestDir)
,moveFile(File srcFile, File destFile)
,moveFileToDirectory(File srcFile, File destDir, boolean createDestDir)
,moveToDirectory(File src, File destDir, boolean createDestDir)
,可使用上述鲁棒性方法实现移动文件的逻辑。
二、运行Java进程切忌遗漏标准输出流和标准错误输出流对应的日志数据
日志数据对于监控Java进程运行和定位问题非常重要,因此,切忌遗漏日志数据。日志数据的一般的目的地有“标准输出流,标准错误输出流,文件,数据库”等,其中去向“标准输出流”和“标准错误输出流”的日志数据最易遗漏,可采用“重定向标准输出流和标准错误输出流”的方式保存这部分日志数据,比如nohup java -classpath "$CLASSPATH" xxxx > $BINDIR/run.out 2>&1 &
。
笔者曾遇到过这样一个案例:有一个运行中的Java进程,观察到其中线程不能正常工作,排查了好久(刚开始没有重定向标准错误输出流而是直接丢弃),最后才发现是由于线程内部抛出了不能被线程内部处理的异常(包括错误)而导致线程终止。线程由于不能处理内部抛出的异常(包括错误)而终止时,一般情况下,最终会调用ThreadGroup类中“uncaughtException(Thread t, Throwable e)”方法内的System.err.print("Exception in thread \"" + t.getName() + "\" "); e.printStackTrace(System.err);
语句,因此,如果早早重定向标准错误输出流,就能很快捕捉到这个信息,而节省很多排查时间。
参考文献: [1]http://xiaoych.iteye.com/blog/149328