第57题】输入、输出系列5-文件锁定功能

网友投稿 554 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

【第57题】输入、输出系列5-文件锁定功能

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小时内删除侵权内容。

上一篇:微机原理-07-中断系统
下一篇:横向扩容 ,我们不做数据的搬运工
相关文章