728x90
반응형
[ IO & Thread ]
Interface
/CommonInfo.java
package step8;
public interface CommonInfo {
//public static final
// MAKE_PATH : 파일을 생성하여 저장하는 directory
String MAKE_PATH = "C:\\kosta203\\test\\repository";
// MUSIC_PATH : 위 경로에 저장된 파일 중 mp3 확장자를 가진 파일들만 이동시키는 directory
String MUSIC_PATH = "C:\\kosta203\\test\\music";
// MOVIE_PATH : 위 경로에 저장된 파일 중 avi 확장자를 가진 파일들만 이동시키는 directory
String MOVIE_PATH = "C:\\kosta203\\test\\movie";
}
Main Class
/TestThreadEx8.java
package step8;
/**
* MakeFileWorker Thread
* : 지정한 수 만큼 지정한 시간 간격으로 랜덤하게 파일을 생성(0.avi or 1.mp3)하여,
* CommonInfo의 MAKE_PATH에 저장한다
*
* MoveFileWorker Thread
* : MAKE_PATH에 저장된 파일들을 확장자에 따라
* MOVIE_PATH 혹은 MUSIC_PATH에 이동시킨다.
* 지정한 시간(7초) 간격으로 Thread를 실행(이동시킴)한다.
*
* @author KOSTA
*
*/
public class TestThreadEx8 {
public static void main(String[] args) {
int makeCount = 30; // 생성할 파일 수
int makePeriod = 1000; // 1초 간격으로 생성
int moveCount = 5 ; //이동시킬 작업 수
int movePeriod = 7000; // 7초 간격으로 이동
MakeFileWorker makeWorker = new MakeFileWorker(makeCount, makePeriod);
MoveFileWorker moveWorker = new MoveFileWorker(moveCount, movePeriod);
// 두 객체를 이용해, 각각 thread 생성하고 start해줌.
new Thread(makeWorker).start();
new Thread(moveWorker).start();
}
}
Thread Class
/MakeFileWorker.java
package step8;
import java.io.File;
import java.io.IOException;
import java.util.Random;
class MakeFileWorker implements Runnable {
private int makeCount; // 생성할 파일 수
private int makePeriod;
public MakeFileWorker(int makeCount, int makePeriod) {
this.makeCount = makeCount;
this.makePeriod = makePeriod;
}
@Override
public void run() {
new File(CommonInfo.MAKE_PATH).mkdirs();
try {
for (int i = 0; i < makeCount; i++) {
File file = new File(CommonInfo.MAKE_PATH + File.separator + createFileName(i));
file.createNewFile();
System.out.println(i + "번째 파일 생성 완료");
Thread.sleep(makePeriod);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// createFileName(int) : 랜덤한 파일명 만들기
public String createFileName(int name) {
Random r = new Random();
if (r.nextBoolean()) // true면 mp3 파일 생성
return name + ".mp3";
else // false면 avi 파일 생성
return name + ".avi";
}
public int getMakeCount() {
return makeCount;
}
public void setMakeCount(int makeCount) {
this.makeCount = makeCount;
}
public int getMakePeriod() {
return makePeriod;
}
public void setMakePeriod(int makePeriod) {
this.makePeriod = makePeriod;
}
}
/MoveFileWorker.java
package step8;
import java.io.File;
public class MoveFileWorker implements Runnable {
int moveCount; // 이동시킬 작업 수
int movePeriod;
public MoveFileWorker(int moveCount, int movePeriod) {
this.moveCount = moveCount;
this.movePeriod = movePeriod;
}
@Override
public void run() {
new File(CommonInfo.MOVIE_PATH).mkdirs();
new File(CommonInfo.MUSIC_PATH).mkdirs();
for (int i = 0; i < moveCount; i++) {
try {
Thread.sleep(movePeriod);
moveFiles();
} catch (InterruptedException e) {
e.printStackTrace();
}//catch
}//for
}//run
// moveFile : 파일의 디렉토리를 이동시켜주는 method
public void moveFiles() {
// 1. 원본파일의 경로 (File)
File orgDir = new File(CommonInfo.MAKE_PATH);
// 2. 이동 목적지의 경로(String)
String musicDir = CommonInfo.MUSIC_PATH;
String movieDir = CommonInfo.MOVIE_PATH;
// 3. 원본파일의 경로 리스트
File[] list = orgDir.listFiles();
// 4. 각각 확장자명에 맞는 폴더로 파일 이동
for (int i = 0; i < list.length; i++) {
if (list[i].isFile()) { // 파일만 보기
String name = list[i].getName(); //name: 파일명
File destFile = null;
if (name.endsWith(".mp3")) {
System.out.println(list[i].getName() + "--> music 폴더로 이동 완료");
destFile = new File(musicDir+File.separator+name);
}
else if (name.endsWith(".avi")) {
System.out.println(list[i].getName() + "--> movie 폴더로 이동 완료");
destFile = new File(movieDir+File.separator+name);
}
list[i].renameTo(destFile);
}
}
}
public int getMoveCount() {
return moveCount;
}
public void setMoveCount(int moveCount) {
this.moveCount = moveCount;
}
public int getMovePeriod() {
return movePeriod;
}
public void setMovePeriod(int movePeriod) {
this.movePeriod = movePeriod;
}
}
결과
makeWorker만 실행했을 때,
=> 1초 간격으로 파일이 생성된다.
moveWorker도 실행됐을 때,
=> 7초 간격으로 각자에 확장자 명에 맞게, 각각의 폴더로 이동한다.
728x90
반응형