본문 바로가기
교육/Java&Spring

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 19

by Renechoi 2023. 1. 13.

파일 입출력 

 

바이트 카피 

파일 카피 

디렉토리 카피 

 

재귀 호출을 통해 전체 파일을 카피한다 

 

package kosta.basic.day019.problem3;

import java.io.*;

public class ProblemMain {
    public static void main(String[] args) throws IOException {

        String source = "/Users/Rene/Documents/rene/Kosta/Cloud_Native_Application_Java_Course/workspace/JavaWork/practiceJava/src/main/java/kosta/basic/day019/testSource";
        String target = "/Users/Rene/Documents/rene/Kosta/Cloud_Native_Application_Java_Course/workspace/JavaWork/practiceJava/src/main/java/kosta/basic/day019/targetDir";

        File sourceDirectory = new File(source);
        File targetDirectory = new File(target);

        copyAll(sourceDirectory, targetDirectory);
    }

    private static void copyAll(File sourceDirectory, File targetDirectory) throws IOException {
        createTargetDirectory(targetDirectory);

        for (File fileEach : sourceDirectory.listFiles()) {
            if (fileEach.isDirectory()) {
                copyAll(fileEach, getFileToCopy(targetDirectory, fileEach));
                continue;
            }
            copyFile(fileEach, getFileToCopy(targetDirectory, fileEach));
        }
    }

    private static void copyFile(File source, File target) throws IOException {
        InputStream inputStream = new FileInputStream(source);
        OutputStream outputStream = new FileOutputStream(target);

        copyBytes(inputStream, outputStream);

        inputStream.close();
        outputStream.close();
    }

    private static void createTargetDirectory(File destinationDirectory) {
        if (!destinationDirectory.exists()) {
            destinationDirectory.mkdir();
        }
    }

    private static File getFileToCopy(File targetDirectory, File fileEach) {
        return new File(targetDirectory, fileEach.getName());
    }

    private static void copyBytes(InputStream inputStream, OutputStream outputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int length = inputStream.read(buffer);
        while (length > 0) {
            outputStream.write(buffer, 0, length);
            length = inputStream.read(buffer);
        }
    }
}

 

 

 


 

 

멀티스레드 

 

 

프로세스와 스레드의 차이 

 

스레드 : 프로그램의 실행 흐름 

 

싱글 스레드 : 스레드가 하나뿐인 프로그램 

멀티 스레드 프로그램 : 스레드가 둘 이상인 프로그램 

 

 

멀티 스레드 

e.g. 채팅 프로그램 

 

A 하다가 B 하다가 C 하다가 -> 시간 지체가 될 수 있다 

cpu의 코어가 하나인 경우 

 

하지만 지금은 코어가 여러개이기 때문에 멀티 스레드 핸들이 가능하다 ! 

 

 

왜 쓰는가 정리 

1. 업무 특성상 (필요한 로직일 때)

2. 성능상 (더 빠를 때)

 

 

Class DigitThread extends Thread {
	public void run() {
    	for (int cnt =0; cnt < 10; cnt++){
        	System.out.print(cnt);
    	}
    }
}

 

thread.start() 

 

시작할 때는 run이 아니라 start를 한다. 

 

runnable 상태로 하는 것이 우리가 할일이기 때문에 run을 직접적으로 호출하지 않는다. => thread를 runnable 상태로 만들어 놓는다. 

 

 

 

sleep(1000) : 1초 동안 not runnable 

 

 

스레드의 상태 분류 

 

critical section : 스레드 실행 중에 다른 스레드로 제어가 넘어가면 문제를 일으킬 수 있는 부분 

 

=> 

동기화 synchronization : 다른 스레드가 간섭하지 못하도록 

보장받기 

 

 

 

synchronized 공유 객체 {

critical section들을 모아놓음 

}

 

 

 

반응형