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();
}
}
}