File/IO

duckbill413·2023년 8월 15일
0

Java

목록 보기
4/5

File/IO

노드스트림

I/O와 스트림

  • 데이터는 한쪽에서 주고 한쪽에서 받는 구조로 되어있음
    • 이때 입력과 출력의 끝단: 노드(Node)
    • 두 노드를 연결하고 데이터를 전송할수 있는 개념 : 스트림(Stream)
    • 스트림은 단방향으로만 통신이 가능하며 하나의 스트림으로 입력과 출력을 같이 처리할 수 없음

ByteStream & CharacterStream

  • ByteStream (Node)
    • 주로 ~~Stream 으로 끝나는 클래스
  • CharacterStream (Filter)
    • 주로 ~~Reader, ~~Writer 로 끝나는 클래스

InputStream과 Reader

  • InputStream
    • read: byte 하나를 읽어서 int로 반환, 더 이상 값이 없으면 -1 리턴
    • close: 스트림을 종료하여 자원을 반납
    • UTF-8을 사용하는 한글의 경우 한 글자가 3byte이므로 문자가 깨질 수 있다.
  • Reader
    • read: char 하나를 읽어서 int로 반환한다. 더 이상 값이 없으면 -1 리턴
    • Reader은 char 하나를 읽으므로 유니코드 문자가 안전하다.

보조스트림

보조 스트림

Filter Stream, Processing Stream

  • 다른 스트림에 부가적인 기능을 제공하는 스트림

  • 파일 데이터 입출력

    • FileInputStream FileOutputStream
    • BufferedInputStream BufferedOutputStream
  • 문자열 입력

    • InputStreamReaderBufferedReader
  • 메모리 객체 출력

    • FileOutputStreamObjectOutputStream

스트림 체이닝(Stream Chaining)

  • 필요에 따라 여러 보조 스트림을 연결해서 사용 가능

보조 스트림 활용

InputStreamReader & OutputStreamWriter

  • byte기반 스트림을 char 기반으로 변경해주는 스트림
    • 문자열을 관리하기 위해서는 byte 단위보다 char 단위가 유리
    • 키보드에서 입력 받은 데이터를 처리하는 경우 등
  • 변환 시 encoding 지정 가능

Buffered 계열

  • 버퍼의 역할
  • 스트림의 입/출력 효율을 높이기 위해 버퍼를 사용하는 스트림
    • BufferedInputStream BufferedOutputStream ← 8192 사이즈를 가진다.
  • BufferedReader & BufferedWriter
    • readLine() → 줄 단위로 데이터를 읽어 들임

객체 직렬화 (Serialization)

  • 객체를 파일등에 저장하거나 네트워크로 전송하기 위해 연속적인 데이터로 변환하는 것
  • 반대의 경우는 역 직렬화(deserialization)
  • 직렬화 되기 위한 조건
    • Serializable 인터페이스를 구현할 것
    • 클래스의 모든 멤버가 Serializable 인터페이스를 구현해야 함
    • 직렬화에서 제외하려는 멤버는 transient 선언
      class Person implements Serializable { // 직렬화를 위해 Serializable 인터페이스
      		private String name;
      		private int age;
      		
      		private transient String ssn; // 직렬화 제외를 위한 transient
      		private LoginInfo lInfo; // LoginInfo class도 Serializable 인터페이스 구현 필요
      }
  • serialVersionUID
    • 클래스의 변경 여부를 파악하기 위한 유일 키
    • 직렬화 할 때의 UID와 역 직렬화 할 때의 UID가 다를 경우 예외 발생
    • UID가 설정되지 않은 경우 컴파일러 자동 생성
      • 멤버 변경으로 인한 컴파일 시마다 변경 → InvalidClassException 초래
    • 직렬화되는 객체에 대해서 serialVersionUID 설정 권장
profile
같이 공부합시다~

0개의 댓글