Thread 예제1: 파일복사&크기구하기

·2022년 11월 3일
0

JAVA객체지향_Thread

목록 보기
2/7

파일 복사 Thread만들기

(복사할 파일 =>1.exe // 생성할 파일 =>copy(복사할 파일에서 정수 1씩 증가).exe)
예> copy2.exe, copy2.exe....

파일 크기 구하는 Thread 만들기

재귀메소드 사용

1.파일복사 2.파일크기구하기 3.종료 선택지 고르는 프로그램으로 만들기

1. 사용할 클래스

Thread, Scanner, File
FileInputStream : 파일을 1byte단위로 읽어오는 클래스
FileOutputStream: 파일을 1byte단위로 출력하는 클래스

2. 큰 틀: 스레드, 메인메소드 작성

//복사Thread
class CopyThread extends Thread{
	@Override
    public void run(){
    }
}
//크기Thread
class SizeThread extends Thread{
	@Override
    public void run(){
    }
}
//main 메소드.선택지 만들고 고르는 프로그램
public class Test{
	public static void main(String[]args){
    	Scanner sc = new Scanner(System.in);
        while(true){
          System.out.println("1.파일복사 2.파일크기구하기 3.종료");
          int n = sc.nextInt();
          switch(n){
          //참조변수 없이 바로 객체생성해서 메소드를 불러올 수 있음
          //단 참조변수가 없기때문에 딱 한번밖에 사용하지 못할때 사용한다.
          case 1: new CopyThread().start(); break;
          case 2: new SizeThread().start(); break;
          case 3: System.exit(0);		//프로그램 자체를 종료시킴
          }
       }
    }
}

3.run()메소드 구현부 작성: 파일 복사

//복사Thread
class CopyThread extends Thread{
	static int n = 1; //생성할 파일에 1씩 더해주기 위한 static변수
	@Override
    public void run(){
      try{
        FileInputStream fis = new FileInputStream("C:\\2207\\1.exe");
        String copy = "copy"+(n++)+".exe";  //copy파일이름
        FileOutputStream fos = new FileOutputStream("C:\\2207\\copy);
        byte[]b = new byte[50];
        while(true){
          int n1 = fis.read(b);
          if(n1==-1) break;
          fos.write(b,0,n1);
        }
        fos.close();
        fis.close();
        System.out.println(copy+"복사본 파일생성 완료!");
      }catch(IOException ie){
      	System.out.println(ie.getMessage());	
      }
      
}
//크기Thread, 재귀메소드 사용
class SizeThread extends Thread{
	@Override
    //run()메소드는 오버라이딩 메소드이기 때문에 재귀메소드로 만들어줄 수 없음
    public void run(){
    	long size = getDirSize(new File("C:\\2207"));
        System.out.println("디렉토리 크기: "+size+"bytes");
    }
    //재귀메소드. 디렉토리를 변수로..
    public long getDirSize(File f){
    	//사이즈 변수 초기화
    	long size =0;
        File[] list = f.listFiles(); //폴더내 파일 목록 배열
        For(File f1:list){  //확장for문 for(참조변수:배열)
        	if(f1.isFile()){  	//list에 있는 f1이 파일이면
            	size+=f1.length();	//해당 파일의 크기를 size에 더함
            }else{		//파일이 아니면 인자를 f1으로 한 재귀메소드 호출하여 size에 더함
            size+=getDirSize(f1);
            }
        }     
        return size;	//for문이 다 돌면 최종 size를 리턴해준다.
    }
}
public class Test{
	public static void main(String[]args){
    	Scanner sc = new Scanner(System.in);
        while(true){
          System.out.println("1.파일복사 2.파일크기구하기 3.종료");
          int n = sc.nextInt();
          switch(n){
          //참조변수 없이 바로 객체생성해서 메소드를 불러올 수 있음
          //단 참조변수가 없기때문에 딱 한번밖에 사용하지 못할때 사용한다.
          case 1: new CopyThread().start(); break;
          case 2: new SizeThread().start(); break;
          case 3: System.exit(0);		//프로그램 자체를 종료시킴
          }
       }
    }
}
profile
웹개발입문자

0개의 댓글