[JAVA] 9강 JAVA I/O & Input/Output Stream & Thread

KDH59·2024년 2월 5일
0

[JAVA]

목록 보기
9/13

JAVA I/O 정의

  • 외부로부터의 DATA도 다를 수 있다.
  • 시스템 안으로 또는 밖으로 이동하는 데이터의 흐름을 시스템이라고 한다.

INPUT / OUTPUT

  • java 패키지크게 input 시스템과 output 시스템으로 나뉜다
  • 바이트 기반과 문자 기반으로 분류한다.

input 시스템과 output 시스템

input stream

  • input stream 은 byte 기반 최상위 class이다

  • output stream 은 byte 기반 최상위 class이다.

console I/O

Scanner

  • 자바에서 사용되는 여러 데이터를 쉽게 읽을 수 있다.

File I/O

  • java에서 file/directory등을 다룰 수 있게 해 주는 객체이다
  • File d에 Data를 읽고 쓰는 기능은 stream을 통해 이루어 진다.

File IO Stream

  • File 객체에 Stream을 활용 하면 파일을 복사 할 수 있다.
  • 이때 File에 특화된 File input Stream / File output Stream 을 사용

순서 (input) ㄱ
1. 읽어올 파일 위치를 설정 읽어올 위치 + 파일객체 + 주스트림
2. 읽기 (read, print)
3. 자원 반납

순서(output)
1.저장할 위치 + 파일 객체 + 주스트림
2.쓰기 (write)
3.자원반납(flush.close)

보조 스트림

  • 보조 스트림은 다른 스트림과 연결되어 추가 기능을 제공해주는 스트림이다.
  • 사용하고 싶은 추가 기능과 관련된 보조 스트림을 추가한다.
  • 보조 스트림은 계속해서 붙일 수 있다. (탑승의 개념으로 활용)

성능 향상 보조 스트림 (버퍼스트림)

  • Buffering = 중간 저장장치이며 굉장히 빠른 속도를 가지고 있다.
  • Buffer 는 전송받은 내용들을 모아서 한꺼번에 전송 할 수 있도록 해주는 임시저장소

버퍼스트림 각 파일을 읽어오고 내보내는데 속도를 향상시키기 위해서 사용
주스트림이 보조스트림 매개변수에 대입해서 사용한다.

기본 타입 입출력 보조 스트림 (데이터 스트림)

  • 바이트 스트림은 기본타입 데어터를 전송할 수 가 없다.
  • 하지만 datainputStream.dataOutputStream 이용하면 가능하다.

코드리뷰

package Chap10.ex06;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
//이미지 복사하기
public class BufferMain {

public static void main(String[] args) throws Exception {
	//읽어올 위치 + 파일객체 + 주 스트림
	FileInputStream fis = new FileInputStream("C:/img/asd.gif");
	//내보낼 위치 + 파일객체 + 주 스트림
	FileOutputStream fos = new FileOutputStream("C:/img/asd_copy.gif");
	//보조 스트림 준비
	BufferedInputStream bis = new BufferedInputStream(fis);
	BufferedOutputStream bos = new BufferedOutputStream(fos);
	
	long start = 0;
	long end = 0;
	
	//읽어오기 -> 쓰기
	int data;
	while((data = bis.read()) !=-1) {
		bos.write(data);
		
	}
	System.out.println("저장 완료");
	
	//자원 반납
	bis.close();
	bos.close();
	bos.flush();

}

}

Exception 준비하거나 읽어올때 throw로 던지는데 두개 이상 예외가 발생하기 때문에 최상위 클래스인 Exception을 사용하여 한번에 처리 할 수 있게 한다.

파일을 읽어오기 위해서 주스트림이 필요하기에 어디서 파일을 읽어올지 지정한다
파일을 내보내기 위해서

보조스트림
각 파일을 읽어오고 내보내는데 속도를 향상시키기 위해서 사용
주스트림이 탑승(매개변수에 대입해서)사용

데이터 변수를 선언 후

데이터는 bis를 읽어오는 것을 담을 변수data 를 지정
이 데이터가 -1이 아닌 이상 계속 실행되게 되어 있는데

자원반납하기

코드리뷰
흐름이 나타나야 되며 객체가 어디에 쓰여있는지 명시하기

Bufferedinput/outputStream

Datainput/outputStream

ObjectDataStream (보조스트림) 객체 입출력 보조 스트림

DataStream 으로만 모든 타입을 보내기에는 무리가 있다
그래서 자바에서 최상위 객체인 Object 다룰수있는 스트림 ObjectDataStream 을 사용한다.

다양한 데이터 형태가 들어 갈 수 있다. 객체 배열 컬렉션

단 class는 덩어리기 때문에 직렬화(serialize)를 통해 잘개 쪼갠 후 사용

규격에 맞게 주고 받아야 되기 때문에 인터페이스를 사용하여 주고 받는다

class 객체의 경우는 직렬화(serialize)를 하지 않으면 전달되지 않는다.
-> 규격이 맞지않아 인터페이스를 사용하여 주고 받아야 한다.

  • 클래스를 전송하기 위해서는 직렬화(잘개쪼개 일렬로 보내는 것)가 필요하다.
  • 다시 맞추기 위해서는 설명서(인터페이스)가 필요하다.

※ 자바에서 규격 잡아주는 역할은 인터페이스
※ 자바에서 Object는 최상위 객체임으로 거의 모든 곳에서 사용 가능

Properties

  • Properties는 MAP 인터페이스를 구현 받음
    ※ hash map 은 사용 후 저장되지않으나 Properties는 파일을 활용 파일에 저장한다.

  • 오브젝트로 저장하면 파일로 볼 수 없음 map은 파일로 확인 가능

  • 맵으로 저장하고 properties

    파일을 파일로 저장하고 읽어올때 파일로 읽어온다

    순서 Properties O

  1. properties 객체에 데이터 저장 단. 한글은 저장되지 않음
  2. 주스트림 준비 + 보조스트림(선택)
  3. 저장
  4. 자원반납
    -> ※flush가 빠지는 이유 -> Properties 에서 알아서 땡겨와서 종료하기 때문

public class ProOutput {

public static void main(String[] args) throws Exception {
	
	// 1. properties 객체에 데이터 저장 -> 단 한글은 저장되지 않음
	Properties prop = new Properties(); // 맵 인터페이스를 구현 받음 put, 
	prop.put("id", "admin");
	prop.put("pass", "1234");
	prop.put("name", "kim.dae-hyen");
	prop.put("email", "kimdae6313@gmai.com");
	// 2. 주스트림 준비 + 보조스트림(선택)
	FileOutputStream fos = new FileOutputStream("src/chap10/ex10/profile.properties");
	// 3. 저장
	prop.store(fos, "simple comment"); // 내보낼 스트림, 주석
	
	// 자원 반납
	fos.close();
}

}

순서
1.스트림 준비
2.Properties 불러오기
3.읽기 ( Map 에서 가져오는 방법과 동일 .get)
-> 향상된 for 문을 이용하여 key.set를 통해 key 전부 불러온 다음 key값만 전부 빼온다.
4.자료 반납

public class ProInput {

public static void main(String[] args) throws Exception {

	// flush 빠지는 이유 -=> Properties에서 알아서 땡겨와서 종료한다.
	
	// 1. 스트림 준비
	FileInputStream fis = new FileInputStream("src/chap10/ex10/profile.properties");
	// 2. Properties 불러오기
	Properties prop = new Properties();
	prop.load(fis); // 스트림으로 읽어 온 값이 Properties 에 저장
	
	// 3. 읽기 (Map 에서 가져오는 방법과 가능 get) 아니면 
	// 향상된 for 문 이용 하여 key.set을 통해 key를 전부 불러온다면 key 값만 전부 빼온다
	for (Object key : prop.keySet()) {
		System.out.println(key+ " " + prop.get(key) );
		
	}
	
	// 4. 자료 반납
	fis.close();
}

JAVA NIO 자바 1.8부터 사용 가능

NIO의 정의와 IO와의 차이점

차이점 스트림을 사용할 필요가 없으며 버퍼가 장착되어 있어 속도개선 할 필요가 없다

java io에서는 File 객체 하나를 통해 수행 했다면
Java nio는 전문클래스를 3부분으로 쪼개어 사용 한다

Path와 files를 사용해보자

  • Java NIO 는 대부분 static 맴버로 구성되어 있다
    원본영역으로 구성되어 있으니 원본영역에서 가져와서 사용

    path는 경로 특화

    Files를 쓰기 위해서는 Paths 을 통해 경로를 실현해야 한다.

java nio 에서 파일 읽는 순서

  1. 읽어올 위치 지정
  2. 읽기
    -> 일반 바이너리 파일의 경우 readBytes(path) 사용 (이미지 등)
    readAIILines(path) 경우 텍스트 읽기
                        

java nio 에서 읽어온 파일 내보내는 순서

1.Scanner 준비
2.Scanner 읽어오기 (입력받은 내용 변수에 저장)
3.내보낼 위치 + 파일 객체 + 주스트림
4.쓰기

  • Append : 파일이 있을 경우에 이후에 내용을 추가
  • CREATE : 파일이 존재하지 않으면 파일 생성
  • CTEATE_NEW : 이미 파일이 존재할 경우 새 파일을 생성
  • READ : 읽기 전용
    5.자원반납

java nio 에서 Copy하는 순서

  1. 위치지정(가져올곳,내보낼곳)
  2. 읽어오기 + 쓰기 = Copt 매서드 사용
    -REPLACE_EXISTING : 이미 파일이 존재할 경우 덮어쓴다. ( 이 옵션이 없으면 파일 존재시 예외 발생
    -COPY_ATTRIBUTES : 파일 속성 까지도 복사 ( 권한. 읽기 여부 등..)

Multi Thread

정의

  • 어떤 프로그램을 실행해주게 해주는 원동력 (Thread)프로그램이 돈다
  • 대표적으로 Main(String[] args) 는 thread를 동작하게 해주는 method 이다
    ※ round robin 방식을 사용 -> 먼저 시작한 일이 먼저 끝나지 않는다

process과 thread의 차이점

※ 프로세스는 한개 이상의 Thread로 구성되어 있다

  • 가장 대표적인 차이는 바로 메모리 공유
  • 프로세스 간에는 메모리 공유가 되지 않는다
  • 쓰래드 간에는 메모리 공유가 된다.

main method는 main thread를 생성 한다.

특징

main thread

thread는 복사가 가능하다

  • 자신을 위해 일할 work thread를 생성 할 수 있다.

요약
thread 는 program를 움직이는 원동력이다.

thread 생성 방법

  1. Runnable interface 구현
    오버라이드 된 내용에 작성하는것

  2. thread class 상속 방법
    내것 처럼 사용하는 것

-> 두 방법 모두 익명 객체를 활용

메인이랑 워크 스래드의 사용법

Thread Name

  • Thread의 이름 지정
    -> 다른 이름을 지정하고 싶다면 SetName()을 사용 하면 된다.
    -> 이름을 가져오고 싶다면 getname()을 사용하면 된다.

Thread 제어

  • Thread는 여러일을 동시에 주기적으로 처리해 줄 순 있으나 순서 제어가 힘듬
  • Thread는 Round robin 방식을 사용하기 때문
    -> 빨리 처리한 녀석이 다음 이을 받는 방식이므로 먼저 시작했다고 먼저 끝나지 않는다

Synchronized(동기화)

  • thread는 메모리를 공유하기에 객체 간의 데이터 간섭이 일어나기도 함
    -> 즉 내가 사용하는 데이터를 누군가 사용하여 값이 바뀔 수도 있다는 뜻

    우리는 기본적으로 동기화(Synchronized)라는 것을 이용하여 잠근다
    ex) vector.HashTable.StringBuffer
    unex) ararryList,HashMap,

-----> 객체가 매서드가 끝나면 같이 끝난다.
실선은 객채를 클래스가 끝날때까지 살아 있다는 뜻

synchronized 사용법 2가지

1. synchronized method

  • 메서드 진입 자체를 막는 방법

2. synchronized block

  • 매서드 안의 특정 영역 진입을 막는 방법

    synchronized 사용법 2가지의 차이점

  • synchronized(동기화)는 순서를 정해준다는 의미

    synchronized method

  1. 식당 밖에서 준비
    -식당안에 장소 협소
    -간섭현상이 있을 경우

    synchronized block

  2. 식당 안 휴식공간에서 준비
    -칸막이가 확실한 접근가능성이 적을 경우

    질문지

1.1 문자기반 바이트 기반의 주고 받는 키워드

  1. output stream 사용시 꼭 필요한 작업은?

  2. 주스트림이 사용하는 방식

  3. ObjectDataStream 사용하는 이유

  4. class의 직렬화란?

  5. Properties 의 어떤 인터페이스를 구현 받는지

  6. NIO와 IO의 차이점

  7. Thread란?

  8. process과 thread의 차이점

  9. work Thread란?

  10. work Thread 만드는 방식 2가지?

  11. Thread Round robin 방식이란?

  12. 동기화(synchronized)란?

profile
[JAVA]

0개의 댓글

관련 채용 정보