出现的问题
实验中要求用log记录所有出现的异常情况和主程序的各个操作,但我们主程序里的各个操作是调用的是各个类的方法,如果全部在各个类里只抛出异常在主程序里处理,那主程序就会很冗余,而且也不符合ADT“自己的事自己干”的思想,一般我们向上抛出的异常是这个类处理不了的,所以我的想法是在各个类中就用try catch语句处理当下出现的异常,那就需要在各个类中就用log记录,一开始我是在在每个类都写上这么一段代码
Logger log = Logger.getLogger("log");
Calendar current = Calendar.getInstance();
FileHandler filehandler = new FileHandler("src/Logging/logging");
current.setFirstDayOfWeek(Calendar.MONDAY);
log.setLevel(Level.INFO);//设置级别
log.addHandler(filehandler);
//将异常信息输出到logging文件中显示出来
```java
current = Calendar.getInstance();
log.warning("发生时间:" + current.getTime().toString() + " 异常类型:NotdependencyrelationException" +
" 类名:FileLoader" + " 方法名:readFlightInfo" + " 具体异常信息:" + e.toString1() + " 处理结果:忽略该条命令行所在的航班计划项");
//在catch语句中写log
我原本以为我在哪几个类中写了这样的语句,程序运行时就会出现几个logging文件,我可以分别在logging文件中查看各种异常情况,但是运行时出现了问题:
并不是我运行一次主程序就只出现一个相应类中的logging文件,而是每一次我调用类,就会生成一个logging文件,只是后缀名改变,logging.1;logging.2;logging.3…而且伴随出现的还有logging.lck这个迷惑玩意儿。
可想而知,实验中输入是一个文件,文件里有十几万个对象需要调用不同类的方法,每一次调用出现两个logging文件,一瞬间直接给我弄死机。然后我就先考虑 .lck是个什么鬼。
logging.lck
见名思意,.lck表示的就是lock锁的含义,意思是一旦生成logging文件就锁住它,只有该进程结束了才释放它,这个锁其他进程不能获取,也就不能写进去东西。什么是进程结束就是主程序结束。所以在主程序没有结束前,我每调用一次类中方法就生成一个logging文件并且锁住它,下一次再生成一个新的文件和.lck文件。这就是问题的原理,好,这样肯定不对,下面说出我解决问题的思路和走的山路十八弯。
一开始我就想那就不要锁住,每次调用都写进一个logging文件中,那就不会出现文件爆炸的情况,事实上通过查阅资料确实是有这样的方法的。在记录日志后写代码如下:
for(Handler h:log.getHandlers())
h.close(); //must call h.close or a .LCK file will remain.
这样就可以了,但又有新的 问题,这不是实验要求的结果呀,实验中还需要对所有异常情况有查询功能,这样文件中永远只有一种操作上的异常,不能保留所有操作的异常,就没办法查询了。显然pass掉这种方法。
我就开始想,之所以每次都会生成logging文件,就是因为这句语句
FileHandler filehandler = new FileHandler(“src/Logging/logging”);
log.addHandler(filehandler);
如果没有这句语句,只保留日志记录的语句,那是把异常情况写到哪里呢,我实验一下,删除所有类中的FileHandler语句,只保留主程序的,结果令我惊喜。所有其他各个类中方法的异常情况全部写到了主程序的logging文件中,而且因为主程序只会生成一个logging文件也不会存在生成无数文件的情况,那这样就可以实现日志查询功能了,只要在所有操作后查询一个logging文件就可以按照过滤条件输出所有满足条件的异常。完美。
这里面显然涉及了线程安全,锁的机制,日志等java知识,我讲的主要还是如何实操以及根据实验得到的一些最浅显的原理,里面真正的原理型知识需要特别学习相关java知识才可以掌握,不然基层东西不了解,写代码会遇到很多你想破头脑都想不出来的bug。
在C语言体系中,
文件
操作对于初学者一直是个神奇的存在,为什么呢?因为
文件
为什么能通过指针来操作一直是个迷。
而且初学者第一次接触了FILE* 这个系统定义的指针类型,可容易因为陌生感而产生畏难情绪,很可惜,本文假定读者已经走过了
对一些系统定义的畏难阶段,不算老手,但是也不完全是 菜鸟。现在,我们一起来操作
文件
常用函数一(api)
- fopen
- fread...
什么是
LCK
文件
类型?
"Lock "的缩写,.
lck
文件
扩展名代表通用的Lock
文件
(.
lck
)
文件
类型。锁
文件
(.
lck
)是由某些应用程序和操作系统自动创建的小型服务
文件
,用于用户当前主动打开的任何用户
文件
。
锁定
文件
(.
lck
)的目的是标记用户
文件
(通常是数据库)的 "繁忙 "状态,以避免在多用户和多任务环境中数据丢失或损坏,否则另一个用户或进程可能会试图向已经打开的
文件
写入。锁定
文件
总是在与要锁定的用户
文件
相同的位置创建,通常借用它们的
文件
名。锁定
文件
的存在 "锁定 "了用户
文件
,禁止所有的写访问,
for(Handler h:
log
.getHandlers())
h.close(); //must call h.close or a .
LCK
file will remain.
FileHandler
文件
处理,实行
文件
从临时目录保存到正式目录、
生成
图片对象的缩略图、获取
文件
信息等功能。
实例:实现用户头像图片的保存,并
生成
对象的缩略图。
1、 创建filehandler.xml
文件
在Config目录下创建filehandler.xml
文件
<FileHandler>
<DirectoryMappings>
<Direc...