본문 바로가기
JAVA SE/Code

CODE [20.08.03/Day_18] Java SE / IO & Thread 스레드 | 파일 생성 및 이동

by 파프리카_ 2020. 8. 3.
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
반응형