본문 바로가기
CS/JAVA

[JAVA] JAVA I/O, 객체의 직렬화

by 두둠칫 2021. 1. 18.

1. JAVA I/O

1) 개요

- JAVA는 byte와 char 그리고 추가적으로 String 단위로 입력과 출력이 이루어진다.

단위 abstract class(최상위 클래스) 하위 클래스
byte InputStream, OutputStream FileInputStream, ObjectInputStream,
FileOutputStream, ObjectOutputStream...
char, String Reader, Writer FileReader, BufferedReader,
FileWriter, PrintWriter...

- 표준입/출력은 각각 키보드와 모니터로 대응되는 Method는 System.in과 System.out이다.

즉, 표준입력 : 표준출력 = 키보드 : 모니터 = System.in : System.out

 

2) 예시

- 키보드 입력 : InputStreamReader

InputStream is = System.in; // byte 단위 처리
InputStreamReader reader = new InputStreamReader(is); // byte 단위를 char(2byte) 단위로 읽도록 변환
BufferedReader br = new BufferedReader(reader); // char 단위를 한 line씩 문자열을 읽도록 변환

// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

try{
	String str = br.readLine();
} catch (IOException e){
	e.printStackTrace();
} finally {
	try {
    	if(br!=null) br.close();
    } catch (IOException e){
    	e.printStackTrace();
    }
}

- File 입력 : FileReader

File f = new FIle("경로"); // file의 meta data 제공
BufferedReader br = null;
FileReader reader = new FileReader(f); // file의 EOF는 NULL로 체크 가능

try{
	br = new BufferedReader(reader);
    String str = br.readLine();
} catch (FileNotFoundException e) {
	...
} finally {
	br.close();
}

- File 출력 : FileWriter

File f = new File("경로"); // new File("경로", true); 기존 file에 내용 추가
PrintWriter out = null;

try{
	FileWriter wr = new FileWriter(f);
    out = new PrintWriter(writer);
    out.println("~");
    // out.fflush();
} catch(IOException e){
	...
} finally {
	out.close();
}

buffer가 가득차지 않는다면 File에 buffer가 담은 data를 쓰지 않는다.

이에 따라 out.fflush();로 명시적으로 buffer를 비우며 File에 쓰거나,

마지막에 out.close(); 를 통해 File에 data가 쓰여질 수 있다.

 

 

2. 객체의 직렬화

- heap에 생성된 인스턴스 데이터를 file이나 network 전송 시 연속적인 데이터(byte data)로 변환하는 과정

- 인스턴스 데이터는 비영속성을 갖기 때문에 프로그램 실행이 종료되면 메모리에서 제거된다.

- 이에 따라 영속성을 가지기 위해서 직렬화를 통해 파일이나 네트워크를 통해 전달하는 방법을 사용한다.

- Serializable를 구현(implement)한 클래스만 가능하다. ex) String

class person implements Serializable{ ... }

public class Main{
	public static void main(...){

	    File f = new File("경로");
        
        objectOutputStream oos = null;
        
        
        try {
			
            FileOutputStream fos = new FileOutputStream(f);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(new Person(...));
        
        } catch(FileNotFoundException e){ ... }
          catch(IOException e) { ... }
          finally {
          	try{
            	oos.close();
            } catch(...){...}
        }    
    }
}

 

'CS > JAVA' 카테고리의 다른 글

[JAVA] Exception  (0) 2021.01.18
[JAVA] Functional Interface, Stream, String, StringBuffer  (0) 2021.01.14
[JAVA] Collection API  (0) 2021.01.14
[JAVA] Anonymous class, Lambda Expression, Generics  (0) 2021.01.14
[JAVA] Abstract, Interface  (0) 2021.01.12