열심히 끝까지
46강 입출력 / 자바의 IO 패키지 본문
<복습>
스트림(Stream)
- 단 방향
- FIFO 구조 갖고있음
- 출력단위에 따라 바이트 기반과 문자단위로 분류
>출력 단위 : 1byte -> 바이트 기반 스트림
문자 -> 문자 기반 스트림
46-1 ) 문자 기반 스트림
: 16bit의 문자나 문자열을 읽고 쓰는 스트림
[1] 문자 기반 스트림의 활용
: 자바에서 사용하는 char형 변수는 2byte이므로 바이트 기반 스트림은 불편하므로,
문자 단위로 입출력을 다루는 문자 기반 스트림을 제공
Reader Writer
int read() void write(int c)
int read(char[] cbuf) void write(char[] cbuf)
abstract int read(char[] cbuf, int off, int len) abstract void write(char[] cbuf, int off, int len)
void write(String str)
void write(String str, int off, int len)
- 대상에 따른 스트림 종류
입력스트림 출력 스트림 대상
FileReader FileWriter 파일
PipedReader PipedWriter 메모리
CharArrayReader CharArrayWriter 프로세스
사용예시
FileReader fr = null;
fr = new FileReader("파일 경로");
46-2 ) 문자 기반 보조 스트림
: 문자 기반 스트림의 성능을 향상시키는 역할
[1] 문자 기반 보조 스트림의 활용
입력 보조 스트림 출력보조 스트림 대상
FilterReader FilterWriter 필터를 이용한 문자 입출력
BufferedReader BufferedWriter 버퍼를 이용한 문자 입출력
사용예시
FileReader fr = null;
fr = new FileReader("파일 경로");
BufferedReader br = new BufferedReader(fr);
46-3 ) 스트림 예외처리
* 입출력의 모든 메서드는 IOException이 발생할 가능성이 높으므로
예외처리가 필요하다.
<실습>
파일 복사 프로그램의 예외처리코드, 문자 기반 스트림 활용
실행 전
실행 후
46-4 ) 객체 직렬화
직렬화?
: 자바 시스템 내부에서 사용하는 객체나 데이터를 외부의 시스템에서
사용할 수 있도록 byte 단위의 데이터로 변환시키는 기술과
바이트로 변환된 데이터를 다시 객체로 변환하는 기술
[1] 객체 전송의 단계
1) 직렬화된 객체를 바이트 단위로 분해한다(marshalling)
2) 직렬화되어 분해된 데이터를 순서에 따라 전송
3) 전송받은 데이터를 복구(unmarshalling)
[2] 마샬링(marshalling)
: 데이터를 바이트(byte) 단위의 데이터로 변환시키는 작업
예시 )
class A implements Serializable{
.....
}
A a = new A();
* 마샬링을 적용할 수 있는 데이터
- 기본 자료형 : boolean, char, byte, short, int, long, float, double ....
- Serializable 인터페이스를 구현한 클래스로 만들어진 객체
* 사용할 클래스 : ObjectOutputStream
[3] 직렬화(Serializable)
: Serializable 인터페이스는 메서드없이 JVM에게 정보 전달 기능만 존재
[4] 언마샬링(unmarshalling)
: 객체 스트림을 통해 전달된 바이트(byte)단위의 데이터를 원래의 객체로 복구하는 작업
* 언마샬링 시 주의할 점!
: 어떤 갹체 형태로 복구할 지 형 변환을 정확하게 명시
* 사용할 클래스 : ObjectInputStream
[정리]
<실습>
User 클래스를 마샬링을 통해 바이트로 변환하여, 파일에 저장하고,
파일에 저장된 객체를 언마샬링을 통해 객체의 정보를 프로그램에 출력하는 코드
-> user.ser이 만들어졌어도 인코딩문제로 못 가져올 수도 있음
* implements Serializable <- 마샬링 가능한 객체
user.ser이 만들어져도 우리 언어로 읽을 수 없는 글이 나온다.
ObjectOutputStream의 매개변수 생성자
ObjectOutputStream(OutputStream out)
: out 스트림에 마샬링한 객체 전달
out.writeObject(객체);
: 객체를 마샬링하여 바이트 소환 후
버퍼스트림(bos)에 전달
ObjectInputStream의 매개변수 생성자
ObjectInputStream(InputStream in)
: 언마샬링을 할 파일 연결
새로운객체 = (클래스)in.readObject();
- 정확한 타입 지정(형변환)
- 언마샬링된 객체를 읽어와 새로운 객체에 저장
'멘토씨리즈 JAVA' 카테고리의 다른 글
48강 Java GUI Programming2 (0) | 2022.05.12 |
---|---|
47강 Java GUI Programming (0) | 2022.05.12 |
45강 입출력 / 자바의 IO 패키지 (0) | 2022.05.11 |
44강 스레드3 (0) | 2022.05.10 |
43강 스레드2 (0) | 2022.05.10 |