EunJng

[Java] 이것이 자바다 Ch. 18 본문

STUDY/JAVA

[Java] 이것이 자바다 Ch. 18

Eunjng 2024. 2. 25. 22:21

'이것이 자바다' 교재 및 강의를 참고하여 정리한 내용입니다.

Ch.18 데이터 입출력

입출력 스트림

  • 스트림
    • 바이트 스트림: 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 입출력할 때 사용
    • 문자 스트림: 문자만 입출력할 때 사용
  바이트 스트림 문자 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 XXXInputStream XXXOutputStream XXXReader XXXWriter

 

바이트 출력 스트림

  • OutputStream 클래스의 주요 메소드
    • write(int b) : 1 byte를 출력
    • write(byte[] b) : 매개값으로 주어진 배열 b의 모든 바이트를 출력
    • write(byte[] b, int off, int len) : 매개값으로 주어진 배열 b[off]부터 len개의 바이트를 출력
      • write() 메소드가 호출되면 버퍼에 바이트를 우선 저장하고, 버퍼가 차면 순서대로 바이트를 출력
    • flush() : 출력 버퍼에 잔류하는 모든 바이트를 출력
    • close() : 출력 스트림을 닫고 사용 메모리 해제
  • write(), flush(), close() 메소드도 IOException이 발생할 수 있으므로 예외 처리를 해야 한다.

 

바이트 입력 스트림

  • InputStream 클래스의 주요 메소드
    • read() : 1byte를 읽은 후 읽은 바이트를 리턴
    • read(byte[] b) : 읽은 바이트를 매개값으로 주어진 배열에 저장 후 읽은 바이트 수를 리턴
      • 더 이상 입력 스트림으로부터 바이트를 읽을 수 없다면 read() 메소드는 -1 리턴
    • close() : 입력 스트림을 닫고 사용 메모리 해제

 

문자 입출력 스트림

  • Wrtier 클래스의 주요 메소드
    • write(int c) : 매개값으로 주어진 한 문자를 출력
    • write(char[] cbuf) : 매개값으로 주어진 배열의 모든 문자를 출력
    • write(char[] cbuf, int off, int len) : 매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자 출력
    • write(String str) : 매개값으로 주어진 문자열 출력
    • write(String str, int off, int len) : 매개값으로 주어진 문자열에서 off 순번부터 len개까지의 문자 출력
    • flush() : 버퍼에 잔류하는 모든 문자 출력
    • close() : 출력 스트림을 닫고 사용 메모리를 해제
  • Reader 클래스의 주요 메소드
    • read() : 1개의 문자를 읽고 리턴
    • read(char[] cbuf) : 읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자 수를 리턴
    • close() : 입력 스트림을 닫고 사용 메모리를 해제

 

보조 스트림

  • 다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림
  • 보조스트림 변수 = new 보조스트림(입출력스트림);
  • InputStreamReader : 바이트 스트림을 문자 스트림으로 변환
  • BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter : 입출력 성능 향상
  • DataInputStream, DataOutputStream : 기본 타입 데이터 입출력
  • PrintStream, PrintWriter : 줄바꿈 처리 및 형식화된 문자열 출력
  • ObjectInputStream, ObjectOutputStream : 객체 입출력

 

문자 변환 스트림

  • 바이트 스트림에서 입출력할 데이터가 문자라면 문자 스트림으로 변환해서 사용하는 것이 좋다.
    • 문자로 바로 입출력할 수 있고, 문자셋의 종류 지정 가능

InputStream을 Reader로 변환

InputStream is = new FileInputStream("C:/Temp/test.txt");
Reader reader = new InputStreamReader(is);

OutputStream을 Writer로 변환

OutputStream os = new FileOutputStream("C:/Temp/test.txt");
Writer writer = new OutputStreamWriter(os);

 

 

 

 

성능 향상 스트림

  • 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업해 실행 성능을 향상시킬 수 있다.

BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림);
BufferedOutputStream bos = new BufferedOutputStream(바이트 출력 스트림);

BufferedReader br = new BufferedReader(문자 입력 스트림);
BufferedWriter bw = new BufferedWriter(문자 출력 스트림);

// BufferedReader: 행 단위로 문자열 읽는 readLine() 메소드 제공
while(true) {
	String str = br.readLine();
    if(str == null) break;
}

 

기본 타입 스트림

  • 바이트 스트림에 DataInputStream와 DataOutputStream 보조 스트림을 연결하면 기본 타입인 boolean, char, short, int, long, float, double 값을 입출력할 수 있다.
  • 데이터 타입의 크기가 모두 다르기 때문에 DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어 올 때는 출력한 순서와 동일한 순서로 읽어야 한다.

프린트 스트림

  • PrintStream, PrintWriter는 프린터와 유사하게 출력하는 print(), println(), printf() 메소드를 가지고 있는 보조 스트림

 

객체 스트림

  • 직렬화: 필드값을 일렬로 늘어선 바이트로 변경 - ObjectOutputStream
  • 역직렬화: 직렬화된 바이트를 객체의 필드값으로 복원 - ObjectInputStream
ObjectInputStream ois = new ObjectInputStream(바이트 입력 스트림);
ObjectOutputStream oos = new ObjectOutputStream(바이트 cnf력 스트림);

oos.writeObject(객체);	// ObjectOutputStream으로 객체 직렬화
객체타입 변수 = (객체타입) ois.readObject();	
// readObject() : 읽은 바이트를 역직렬화해서 객체로 생성
    // 리턴 타입이 Object이므로 구체적 타입으로 강제 타입 변환

Serializable 인터페이스

  • 자바는 Serializable 인터페이스를 구현한 클래스만 직렬화할 수 있도록 제한
  • Serializable 인터페이스: 멤버가 없는 빈 인터페이스이지만, 객체를 직렬화할 수 있다고 표시하는 역할
public class XXX implements Serializable {
	public int field1;
    protected int field2;
    int field3;
    private int field4;		// 1~4 : 직렬화
    public static int field5;	// 정적 필드는 직렬화에서 제외
    transient int field6;	// transient로 선언된 필드는 직렬화에서 제외
}

serialVersionUID 필드

  • 직렬화할 때 사용된 클래스와 역직렬화할 때 사용된 클래스는 동일한 클래스여야 한다.
  • 클래스 내용이 다르더라도 직렬화된 필드를 공통으로 포함하고 있다면, 두 클래스가 동일한 serialVersionUID 상수값을 가지면 역직렬화 가능
public class Member implements Serializable {
	static final long serialVersionUID = 1;
    int field1;
    int field2;
}

public class Member implements Serializable {
	static final long serialVersionUID = 1;
    int field1;
    int field2;
    int field3;
}

 

File과 Files 스트림

File 클래스

  • File file = new File("경로");
  • exists() : 파일이나 폴더 존재 여부 확인
    • 리턴값이 false
      • createNewFile(), mkdir(), mkdirs()
    • true
      • delete(), canExecute(), canRead(), canWrite(), getName(), getParent(), getParentFile(), getPath(), isDirectory(), isFile(), isHidden(), lastModified(), length(), list(), list(FilenameFilter filter), listFiles(), listFiles(FilenameFilter filter)

Files 클래스

  • 정적 메소드로 구성되어 있어 객체로 만들 필요가 없다.

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

[Java] 이것이 자바다 Ch.19  (0) 2024.02.27
[Java] 이것이 자바다 Ch.17  (0) 2024.02.22
[Java] 이것이 자바다 Ch.16  (0) 2024.02.20
[Java] 이것이 자바다 Ch.15  (0) 2024.02.19
[Java] 이것이 자바다 Ch.14  (0) 2024.02.16