MakeFileWorker Thread
- repository 디렉토리에 일정한 간격으로 avi 확장자의 동영상 파일과 mp3 확장자의 음악 파일을 생성한다. (MakeFileWorker 스레드를 정의해 실행한다)(1초 간격으로 30번 실행한다)
- mp3 와 avi 확장자는 랜덤하게 만들어져야 한다 .
- 파일명은 0~29번까지 매번 실행할 때마다 그 범위안에서 순차적으로 이름이 지어져야 한다 .
예 ) 0_1661484144987.avi 또는 0_1661484144987.mp3- 파일명이 중복될 수 있으므로 시간정보를 중간에 삽입한다.
step1. 업무파악
step2. 확장자를 랜덤하게 할당
java.util.Random
step3. 파일명에 시간정보를 배당
System.currentTimeMills();
step4. 디렉토리와 파일생성
java.io.File mkdirs() , createNewFile();
MoveFileWorker Thread
- 동시에 repository 디렉토리에 생성된 파일을 일정 주기동안 반복하면서 확장자별로 avi 동영상 파일은 movie 디렉토리로 이동시킨다.
- mp3 음악 파일은 music 디렉토리로 분류해서 파일을 이동시킨다.( 7초 간격으로 5번 실행한다 )
step5. 파일 이동
java.io.File renameTo()
step6. 디렉토리 내의 파일리스트 정보 -> 확장자별 분류
java.io.File listFiles()
- MakeFileWorker class를 만들고 Runnable을 implements한다.
- 1초 간격으로 파일을 30번 생성하기때문에 생성자로 makeCount와 makePeriod를 선언한다.
- makeDir() 메소드와 makeFile() 메소드를 분리해 코드를 구현한다. (파일을 삽입할 경로의 디렉토리가 존재하면 makeFile() 메소드를 실행하고, 그렇지 않다면 생성 후 makeFile() 메소드를 실행할 수 있도록 구현한다.
public void makeDir(){
File fileDir = new File(Path.MAKE_PATH);
if(fileDir.isDirectory()==false) {
fileDir.mkdirs();
}
}
System.out.println(System.currentTimeMillis());
1662204788260
1662204788261
결과는 이러하다. 우리가 파일명으로 이 시간 정보를 이용할 수 있다.
public void makeFile() throws IOException, InterruptedException {
Random random = new Random();
for (int i = 0; i < makeCount; i++) {
Thread.sleep(makePeriod);
String fileName = null;
long time = System.currentTimeMillis();
fileName = i + "_" + time + "_";
if (random.nextBoolean())// true이면{
fileName += ".mp3";
else {
fileName += ".avi";
}
newFile = new File(fileDir+File.separator + fileName);
System.out.println(fileName);
newFile.createNewFile();
}
}
for문은 1초 간격으로 실행되게하였고, 30번 fileName을 새로 만들게 하였다.
i에 System.currentTimeMillis()로 시간 정보를 더하고 random.nextBoolean() 메소드를 이용해 두가지 경우를 만들어 mp3와 avi로 분류해 또 이름에 더할 수 있게 하였다.
그리고 그 이름을 사용하여 파일 객체를 생성해 경로를 생성하고, createNewFile()을 통해 파일을 1초 간격으로 생성할 수 있게 하였다.(예외처리는 throw해주었다)
Random random=new Random(); System.out.println(random.nextBoolean()); System.out.println(random.nextBoolean()); System.out.println(random.nextBoolean()); if(random.nextBoolean()){ ext=".mp3"; String fileName="test"+ext; System.out.println(fileName); }
true
false
true
test.avi
false
random.nextBoolean()은 두가지경우인 true, 혹은 false를 반환한다.
- MoveFileWorker class를 만들고 Runnable을 implements한다.
- 디렉토리 생성을 위한 makeDirs() 메소드를 만든다.
- 7초 간격으로 5번 이동시키기 위해 for loop를 이용해 moveFiles() 메소드를 만든다.
public void makeDirs() {
if (movieFileDir.isDirectory() == false) {
movieFileDir.mkdirs();
}
if (musicFileDir.isDirectory() == false) {
musicFileDir.mkdirs();
}
}
파일을 분류하기위해 미리 경로에 해당하는 디렉토리가 있는지 확인하는 메소드를 만든다.
2.moveFiles()
File[] files = fileDir.listFiles();
File moveFile = null;
File destFile = null;
for (int i = 0; i < files.length; i++) {
moveFile = new File(Path.MAKE_PATH + File.separator + files[i].getName());
if (files[i].getName().endsWith(".mp3")) {
System.out.println("mp3");
destFile = new File(Path.MUSIC_PATH + File.separator + files[i].getName());
moveFile.renameTo(destFile);
System.out.println(destFile);
} else {
destFile = new File(Path.MOVIE_PATH + File.separator + files[i].getName());
moveFile.renameTo(destFile);
System.out.println(destFile);
}
}
File[] files = fileDir.listFiles();
listFiles()메소드로 파일을 반환하는 참조 변수를 선언했다.
이 코드로 해당 경로의 파일들이 리스트 형식으로 files라는 변수에 반환되는 것이다.
for (int i = 0; i < files.length; i++) {
moveFile = new File(Path.MAKE_PATH + File.separator + files[i].getName());
for문으로 반환한 files의 길이 만큼 돌면서 moveFile이라는 변수에 file이름을 갖는 새로운 파일 객체를 생성한다.
if (files[i].getName().endsWith(".mp3")) {
System.out.println("mp3");
destFile = new File(Path.MUSIC_PATH + File.separator + files[i].getName());
moveFile.renameTo(destFile);
System.out.println(destFile);
} else {
destFile = new File(Path.MOVIE_PATH + File.separator + files[i].getName());
moveFile.renameTo(destFile);
System.out.println(destFile);
}
파일이름이 .mp3로 끝나는지 .avi로 끝나는지 확인하며 해당 경로에 이동할 수 있도록한다.
public void run() {
makeDirs();//디렉토리 생성을 위해 호출
for(int i=0;i<moveCount;i++) {
try {
Thread.sleep(movePeriod);
moveFiles();
} catch (InterruptedException e) {
e.printStackTrace();
}
//디렉토리 내의 파일을 이동시키기 위해 호출
System.out.println("MoveFileWorker Thread가 파일들을 이동");
}
}
7초 간격으로 5번 이동시키기 위해 for loop를 이용한다.
public class TestThreadMiniProject {
public static void main(String[] args) {
int makeCount=30;//파일 생성수 30번
int makePeriod=1000;//생성 주기 1초간격
MakeFileWorker makerWorker
=new MakeFileWorker(makeCount,makePeriod);
Thread thread = new Thread(makerWorker);
thread.start();
// 스레드 생성 후 start 시킨다
int moveCount=5;
int movePeriod=7000;
MoveFileWorker moveFileWorker =new MoveFileWorker(moveCount,movePeriod);
Thread thread2 = new Thread(moveFileWorker);
thread2.start();
}
}