掌握Excel除法运算技能助你提升工作效率
522
2022-05-29
回城传送–》《JAVA筑基100例》
文章目录
零、前言
一、题目描述
二、解题思路
三、代码详解
多学一个知识点
四、推荐专栏
五、示例源码下载
零、前言
今天是学习 JAVA语言 打卡的第57天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。
因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
一、题目描述
题目:在操作文件时,有时会遇到一个问题:该文件已经被另一个程序占用,打开失败。这是因为另一个程序在编辑此文件。
实现:对D盘的xiaoxuzhu.txt文件进行锁定1分钟,1分钟后解锁。
二、解题思路
创建一个类:EncryptInput
使用FileChannel类的tryLock()获取文件锁定,如果没获取到文件锁,会返回null。可以通过这个返回值判断是否有没有被锁定。
FileLock 一般都是从FileChannel 中获取
FileLock 是文件锁,它能保证同一时间只有一个进程(程序)能够修改它,或者都只可以读,这样就解决了多进程间的同步文件,保证了安全性。但是需要注意的是,它进程级别的,不是线程级别的,他可以解决多个进程并发访问同一个文件的问题,但是它不适用于控制同一个进程中多个线程对一个文件的访问。这也是为什么它叫做 多进程文件锁,而不是 多线程文件锁。
三、代码详解
EncryptInput类
package com.xiaoxuzhu; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileLock; /** * Description: * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class EncryptInput { @SuppressWarnings("unused") public static void fileLock(String file) { FileOutputStream fous = null; // 创建FileOutputStream对象 FileLock lock = null; // 创建FileLock对象 try { fous = new FileOutputStream(file,true); // 实例化FileOutputStream对象 lock = fous.getChannel().tryLock(); // 获取文件锁定 if(lock==null){ //不需要处理了 return; } String str = "虚竹哥好帅"; IoUtil.write(fous, CharsetUtil.UTF_8,Boolean.FALSE,str); Thread.sleep(60 * 1000); // 线程锁定1分钟 } catch (Exception e) { e.printStackTrace(); }finally { try { if(lock!=null){ lock.release(); } System.out.println("文件解锁"); IoUtil.close(fous); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { System.out.println("对 D://xiaoxuzhu1.txt 的文件进行锁定"); // 创建文件对象 String file = "D://xiaoxuzhu1.txt"; // 调用文件锁定方法 fileLock(file); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
EncryptInput2类:测试是否锁定了文件
package com.xiaoxuzhu; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileLock; /** * Description: * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class EncryptInput2 { @SuppressWarnings("unused") public static void fileLock(String file) { FileOutputStream fous = null; // 创建FileOutputStream对象 FileLock lock = null; // 创建FileLock对象 try { fous = new FileOutputStream(file,true); // 实例化FileOutputStream对象 lock = fous.getChannel().tryLock(); // 获取文件锁定 if(lock==null){ //不需要处理了 System.out.println("没有获取到文件锁,此文件已被锁定"); return; } String str = "虚竹哥57好帅"; IoUtil.write(fous, CharsetUtil.UTF_8,Boolean.FALSE,str); Thread.sleep(60 * 1000); // 线程锁定1分钟 } catch (Exception e) { e.printStackTrace(); }finally { try { if(lock!=null){ lock.release(); } IoUtil.close(fous); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { System.out.println("对 D://xiaoxuzhu1.txt 的文件进行锁定"); // 创建文件对象 String file = "D://xiaoxuzhu1.txt"; // 调用文件锁定方法 fileLock(file); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
多学一个知识点
new一个FileOutputStream对象时,如果file文件内容本身存在,会清空数据。
new FileOutputStream(file);
1
如果不要清空数据,可以使用
= new FileOutputStream(file,true);
1
四、推荐专栏
《JAVA从零到壹》
《JAVA从零到壹》第八讲:系统常用类
《Hutool实战》7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)
五、示例源码下载
关注下面的公众号,回复筑基+题目号
筑基57
Java 任务调度
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。