input stream 은 byte 기반 최상위 class이다
output stream 은 byte 기반 최상위 class이다.
순서 (input) ㄱ
1. 읽어올 파일 위치를 설정 읽어올 위치 + 파일객체 + 주스트림
2. 읽기 (read, print)
3. 자원 반납
순서(output)
1.저장할 위치 + 파일 객체 + 주스트림
2.쓰기 (write)
3.자원반납(flush.close)
버퍼스트림 각 파일을 읽어오고 내보내는데 속도를 향상시키기 위해서 사용
주스트림이 보조스트림 매개변수에 대입해서 사용한다.
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이 아닌 이상 계속 실행되게 되어 있는데
자원반납하기
코드리뷰
흐름이 나타나야 되며 객체가 어디에 쓰여있는지 명시하기
DataStream 으로만 모든 타입을 보내기에는 무리가 있다
그래서 자바에서 최상위 객체인 Object 다룰수있는 스트림 ObjectDataStream 을 사용한다.
다양한 데이터 형태가 들어 갈 수 있다. 객체 배열 컬렉션
규격에 맞게 주고 받아야 되기 때문에 인터페이스를 사용하여 주고 받는다
class 객체의 경우는 직렬화(serialize)를 하지 않으면 전달되지 않는다.
-> 규격이 맞지않아 인터페이스를 사용하여 주고 받아야 한다.
※ 자바에서 규격 잡아주는 역할은 인터페이스
※ 자바에서 Object는 최상위 객체임으로 거의 모든 곳에서 사용 가능
Properties는 MAP 인터페이스를 구현 받음
※ hash map 은 사용 후 저장되지않으나 Properties는 파일을 활용 파일에 저장한다.
오브젝트로 저장하면 파일로 볼 수 없음 map은 파일로 확인 가능
맵으로 저장하고 properties
파일을 파일로 저장하고 읽어올때 파일로 읽어온다
순서 Properties O
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 io에서는 File 객체 하나를 통해 수행 했다면
Java nio는 전문클래스를 3부분으로 쪼개어 사용 한다
Path와 files를 사용해보자
Java NIO 는 대부분 static 맴버로 구성되어 있다
원본영역으로 구성되어 있으니 원본영역에서 가져와서 사용
path는 경로 특화
Files를 쓰기 위해서는 Paths 을 통해 경로를 실현해야 한다.
1.Scanner 준비
2.Scanner 읽어오기 (입력받은 내용 변수에 저장)
3.내보낼 위치 + 파일 객체 + 주스트림
4.쓰기
※ 프로세스는 한개 이상의 Thread로 구성되어 있다
main method는 main thread를 생성 한다.
thread는 복사가 가능하다
요약
thread 는 program를 움직이는 원동력이다.
Runnable interface 구현
오버라이드 된 내용에 작성하는것
thread class 상속 방법
내것 처럼 사용하는 것
-> 두 방법 모두 익명 객체를 활용
메인이랑 워크 스래드의 사용법
thread는 메모리를 공유하기에 객체 간의 데이터 간섭이 일어나기도 함
-> 즉 내가 사용하는 데이터를 누군가 사용하여 값이 바뀔 수도 있다는 뜻
우리는 기본적으로 동기화(Synchronized)라는 것을 이용하여 잠근다
ex) vector.HashTable.StringBuffer
unex) ararryList,HashMap,
-----> 객체가 매서드가 끝나면 같이 끝난다.
실선은 객채를 클래스가 끝날때까지 살아 있다는 뜻
매서드 안의 특정 영역 진입을 막는 방법
synchronized(동기화)는 순서를 정해준다는 의미
synchronized method
식당 밖에서 준비
-식당안에 장소 협소
-간섭현상이 있을 경우
synchronized block
식당 안 휴식공간에서 준비
-칸막이가 확실한 접근가능성이 적을 경우
1.1 문자기반 바이트 기반의 주고 받는 키워드
output stream 사용시 꼭 필요한 작업은?
주스트림이 사용하는 방식
ObjectDataStream 사용하는 이유
class의 직렬화란?
Properties 의 어떤 인터페이스를 구현 받는지
NIO와 IO의 차이점
Thread란?
process과 thread의 차이점
work Thread란?
work Thread 만드는 방식 2가지?
Thread Round robin 방식이란?
동기화(synchronized)란?