java 文件锁 并发_【并发】4、文件锁,多线程队列拷贝文件,并读取的操作

packageio;importorg.junit.Test;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.nio.channels.FileChannel;importjava.nio.channels.FileLock;/*** @ProjectName: cutter-point

* @Package: io

* @ClassName: FileLockTest

* @Author: xiaof

* @Description: 测试多线程下的文件锁

* @Date: 2019/3/7 9:34

* @Version: 1.0*/

public classFileLockTest {//第一个线程不断吧文件从文件A拷贝到B,然后从B拷贝到A//第二个线程不断遍历B文件夹,并遍历B文件夹的数据,输出到控制台

private final static String baseDir1 = "C:\\Users\\xiaof\\Desktop\\1\\dir-t1";private final static String baseDir2 = "C:\\Users\\xiaof\\Desktop\\1\\dir-t2";

@Testpublic voidtest1() {//String fileName = "多线程队列.png";

FileOutputStream fileOutputStream = null;

FileInputStream fileInputStream= null;//反复吧文件拷贝到两个目录中

try{while(true) {

System.out.println(Thread.currentThread()+ "-休眠1s开始新一轮拷贝");

Thread.sleep(1000);//判断文件目录是否有文件

File dir1 = newFile(baseDir1);

String souDir= "";

String desDir= "";if(dir1.listFiles().length > 0) {

souDir=baseDir1;

desDir=baseDir2;

}else{//吧文件从2拷贝到1

souDir =baseDir2;

desDir=baseDir1;

}//吧文件从1拷贝到2//1.遍历所有文件,依次上锁

File sourFileDir = newFile(souDir);for(int i = 0; i < sourFileDir.listFiles().length; ++i) {

File tmpFile=sourFileDir.listFiles()[i];//输出

fileInputStream = newFileInputStream(tmpFile);

fileOutputStream= new FileOutputStream(desDir + "/" +tmpFile.getName());//对写的文件进行上锁,读的文件不需要上锁

FileChannel fileChannel =fileOutputStream.getChannel();

FileLock fileLock= null;//操作之前判断是否已经被锁住

while(true) {

fileLock=fileChannel.tryLock();if(fileLock != null) {//已上锁

break;

}else{

System.out.println(Thread.currentThread()+ "-文件已被锁定,休眠1s");

Thread.sleep(1000);

}

}//拷贝数据

byte buf[] = new byte[1024];int len = 0;while((len = fileInputStream.read(buf)) != -1) {

fileOutputStream.write(buf,0, len);

}

fileOutputStream.flush();//最后删除源文件

fileLock.release();//解锁

fileChannel.close();

fileOutputStream.close();

fileInputStream.close();

fileInputStream= null;

fileOutputStream= null;if(tmpFile.delete()) {

System.out.println("删除源文件");

}

}

}

}catch(Exception e) {

e.printStackTrace();

}

}

@Testpublic voidtest2() {//读取文件并输出

FileOutputStream fileOutputStream = null;

FileInputStream fileInputStream= null;try{//判断文件是否存在

while (true) {

Thread.sleep(1000);

File dir1= newFile(baseDir1);

String souDir= "";

String desDir= "";

souDir=baseDir1;

desDir=baseDir2;//if(dir1.listFiles().length > 0) {//souDir = baseDir1;//desDir = baseDir2;//} else {// //吧文件从2拷贝到1//souDir = baseDir2;//desDir = baseDir1;//}

File sourFileDir= newFile(souDir);for(int i = 0; i < sourFileDir.listFiles().length; ++i) {

File tmpFile=sourFileDir.listFiles()[i];//输出

fileInputStream = newFileInputStream(tmpFile);//拷贝数据

byte buf[] = new byte[1024];int len = 0;

ByteArrayOutputStream byteArrayOutputStream= newByteArrayOutputStream();while((len = fileInputStream.read(buf)) != -1) {

byteArrayOutputStream.write(buf,0, len);

}

System.out.println("读取目录:" +souDir);

System.out.println(byteArrayOutputStream.toString());//最后删除源文件

fileInputStream.close();

fileInputStream= null;

}

}

}catch(Exception e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值