[배운내용정리] 1126 자바 국비교육
2020년 11월 26일 9시 ~ 15시 30분 zoom으로 수업 진행
보조 스트림
스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 입출력 처리 불가능
기반 스트림을 먼저 생성하고 이를 이용하여 보조 스트림 생성
보조 스트림 종류
문자 변환 (InputStreamReader / OutputStreamReader)
입출력 성능 (BufferedInputStream / BufferedOutputStream)
기본 데이터 타입 출력 (DataInputStream / DataOutputStream)
객체 입출력 (ObjectInputStream / ObjectOutputStream)
예시
FileInputStream fis = new FileInputStream(“sample.txt”); //기반 스트림 생성 |
문자 변환 보조 스트림 ( 문자 단위의 보조 스트림 )
소스 스트림이 바이트 기반 스트림이지만, 데이터가 문자일 경우 사용
Reader와 Writer는 문자 단위로 입출력을 하기 때문에 ,
데이터가 문자인 경우 바이트 기반 스트림보다 편리하게 사용 가능
InputStreamReader = 바이트 -> 문자
OutputStreamReader = 문자 -> 바이트
성능 향상 보조 스트림
느린 속도로 인해 입출력 성능에 영향을 미치는 입출력 소스를 이용하는 경우 사용
입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업을 하여 실행 성능 향상
(입출력 횟수를 줄인다)
+Buffered 붙으면 성능 향상!, 버퍼에 모아 놓고 한번에 처리하는 친구
기본 타입 입출력 보조 스트림
기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능 제공
단, 입력된 자료형의 순서와 출력될 자료형의 순서 일치
객체 입출력 보조 스트림
객체를 파일 또는 네트워크로 입출력 할 수 있는 기능 제공
단, 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화 필수
직렬화와 역직렬화
직렬화(Serialization)
Serialization 인터페이스를 implements 하여 구현한다
객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환하지만
transient 키워드를 사용한 필드는 직렬화에서 제외
역직렬화(Deserialization)
직렬화 된 객체를 역직렬화 할 때는 직렬화 했을 때와 같은 클래스 사용
단, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화 실패
serialVersionUID 필드
직렬화한 클래스와 같은 클래스임을 알려주는 식별자 역할로 컴파일 시 JVM이 자동으로
serialVersionUID 정적 필드를 추가해줘 별도로 작성하지 않아도 오류는 나지 않지만
자동 생성 시 역직렬화에서 예상하지 못한 InvalidClassException을 유발할 수 있어 명시 권장.
private static final long serialVersionUID = -6423919775137290062l; |
package com.io.part02_charStream;
public class Run {
public static void main(String[] args) {
TestCharStream cs = new TestCharStream();
//cs.fileSave();
cs.fileOpen();
}
}
package com.io.part02_charStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestCharStream {
public void fileSave() {
//문자 기반 스트림
//FileReader
FileWriter fw = null;//통로를 연결하기 위한 객체 생성 준비
try {
fw = new FileWriter("sample2.txt");//파일과 자바 입출력의 통로 연결
fw.write("우리나라 대한민국");
//sample2.txt 파일이 생성되면서 우리나라 대한민국 이라는 문자가 저장된다
fw.write('A');
//그냥 1바이트짜리 문자도 잘 들어간다 ㅎㅎ
} catch (FileNotFoundException e) {
//FileWriter 객체 생성하면서 발생하는 Exception 처리
e.printStackTrace();
}
catch (IOException e) {
//fw.write("우리나라 대한민국");의 Exception 처리
e.printStackTrace();
}
finally {
try {
fw.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
/*
//객체를 밖에 따로 선언하는게 싫을 경우 이렇게도 사용 할 수 있다.
//try catch는 이런 식으로도 사용 할 수 있다. try와 resource
try (FileWriter fw = new FileWriter("sample2.txt");) {
//try resource는 자동으로 close() 해준다!
//finally에 fw.close() 작성할 필요 없음
fw.write("우리나라 대한민국");
}
catch (IOException e) {
e.printStackTrace();
}
*/
}
public void fileOpen() {
//문자 단위 스트림
FileReader fr = null;
try {
fr = new FileReader("sample2.txt");
//대상 파일이 없을 겨우 , FileNotFoundException 발생, 예외처리 필요
int val;
/*
while((val = fr.read()) != -1) {
//System.out.print(val + " ");
//50864 47532 45208 46972 32 45824 54620 48124 44397 65 출력된다.
System.out.print((char)val + " ");
//우 리 나 라 대 한 민 국 A 출력된다
}
*/
for(int i=0; i<15; ++i) {
System.out.print(fr.read() + " ");
//50864 47532 45208 46972 32 45824 54620 48124 44397 65 -1 -1 -1 -1 -1
//출력된다 -1은 왜 출력될까?
//.read() 메소드는 파일의 끝을 만날 경우 -1을 반환하는데
//파일에 저장된 데이터의 길이보다 길게 데이터를 받으려고 했기 때문에
//i가 반복되는 동안 더이상 읽을 수 있는 데이터가 없어서 -1을 반환 , 출력한다.
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
fr.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
package com.io.part03_addStream.ch01_byteTochar;
public class MTest {
public static void main(String[] args) {
TestStream t = new TestStream();
//t.output();
t.input();
//두개 같이 쓰면 output에서 사용한 표준입출력장치를 close() 시켜버렸기 때문에
//input 메소드에서 표준입출력장치를 이용해 입력 하려고 할때 장치를 찾을 수 없어서
//input이 제 기능을 못 한다.
}
}
package com.io.part03_addStream.ch01_byteTochar;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TestStream {
public void output() {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// System.out 기반 스트림인 표준 입출력 장치 -> 콘솔창 / byte 단위임!
// System.out 을 이용해 byte기반 스트림을 열고 콘솔창과 연결
// 문자 단위 스트림인 BufferedWriter를 이용해 버퍼에 모았다가 한번에 출력하려는 작업임
// 자바에서 BufferedWirter를 이용해 콘솔창에 문자 출력 할 예정,
// 문자 기반인 BufferedWirter와 바이트 기반인 콘솔의 크기 차이를 적당하게 변환하기 위해
// 표준입출력 장치와 BufferedWirter 사이에 , 변환 보조 스트림인 OutputStreamWriter 를 활용함!
try {
bw.write("java oracle JDBC");
bw.flush();
// 버퍼의 data를 밀어내기 위해 사용하는 메소드
// 콘솔창에 java oracle JDBC 출력된다.
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
public void input() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("문자열 입력 : ");
try {
String val = br.readLine();
System.out.println("val : " + val);
//안녕하세요 입력하면, 콘솔창에 안녕하세요 출력된다
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
br.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
package com.io.part03_addStream.ch02_buffer;
public class MTest {
public static void main(String[] args) {
TestBuffer t = new TestBuffer();
//t.input();
t.output();
}
}
package com.io.part03_addStream.ch02_buffer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestBuffer {
public void input() {
// 기반 스트림을 먼저 만들어야 한다
FileReader fr = null;
// FileReader를 사용해 스트림을 생성
BufferedReader br = null;
try {
fr = new FileReader("sample2.txt");
br = new BufferedReader(fr);
// BufferedReader을 사용하기 위해선 ()안에 기반스트림이 들어와야함
// 이렇게도 사용 가능함
// br = new BufferedReader(new FileReader("sample3.txt"));
// new 보조스트림(new 기반 스트림(외부자원));
// new 보조스트림(new 스트림());
// 보조스트림안에 기반스트림, 보조스트림 둘다 오니까 그냥 스트림 온다고 알고있자
// 기반 스트림 ()안에는 외부자원이 들어온다
String tmp;
// BufferedReader를 사용했기 때문에
// 문자열을 다 읽고 더이상 가져올게 없으면 null 값을 가져온다.
while ((tmp = br.readLine()) != null) {
System.out.println(tmp);
}
// sample2.txt == 우리나라 대한민국A일때 우리나라 대한민국A 이 출력된다.
// sample2.txt ==우리나라 대한민국A
// 안녕하세요
// 5교시 입니다. 일경우 그대로 출력된다.
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
public void output() {
// BufferedWriter를 이용하여 스트림을 생성한 후
// "안녕하세요"
// "반갑습니다"
// 라고 sample2.txt에 출력해보자
try (BufferedWriter bw = new BufferedWriter(new FileWriter("sample2.txt"));){
bw.write("안녕하세요\n");
bw.write("반갑습니다.");
//try resource라 close할 필요 없음
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.io.part03_addStream.ch03_TestData;
public class MTest {
public static void main(String[] args) {
TestData td = new TestData();
td.test();
}
}
package com.io.part03_addStream.ch03_TestData;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestData {
public void test() {
try (DataInputStream din = new DataInputStream(new FileInputStream("score.txt"));
DataOutputStream dout = new DataOutputStream(new FileOutputStream("score.txt"));)
{
// DataInputStream은 보조 스트림, 보조스트림 괄호 안에는 다른 스트림이 들어와야 함
// FileInputStream은 기반 스트림, 기반 스트림 안에는 외부자원이 들어와야 함
// DataOutputStream은 보조 스트림, 보조스트림 괄호 안에는 다른 스트림이 들어와야 함
// FileOutputStream은 기반 스트림, 기반 스트림 안에는 외부자원이 들어와야 함
//파일에 자료형별로 기록
dout.writeUTF("홍길동");//UTF는 인코딩
dout.writeInt(95);//그냥 int형 데이터 95를 저장하는게 아니라, int형이라는 정보와 함께 값이 저장되는것
dout.writeChar('A');
dout.writeUTF("이순신");
dout.writeInt(77);
dout.writeChar('C');
dout.writeUTF("김철수");
dout.writeInt(81);
dout.writeChar('B');
while(true) {
System.out.println(din.readUTF() + din.readInt() + din.readChar() );
//파일에 저장할때는 정보와 함께 저장해서 파일이 깨진것 처럼 보였는데
//읽어올때는 컴퓨터가 알아서 정보확인하고 데이터만 가져와서 이쁘게 잘 보인다
//EOFException은 파일의 끝인데도 뭘 하려해서 생기는 예외
//얘는 파일의 끝을 만나면 어쩔수없이 무조건 발생하는 친구라
//EOFException 처리만 잘 해주면 된다.
}
}
catch (EOFException e) {
System.out.println("파일 읽기 완료");
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}