I/O

조상원·2025년 8월 2일

JAVA

목록 보기
27/34

데이터는 키보드, 파일 또는 네트워크로부터 입력될 수 있고 모니터, 파일 또는 네트워크로 출력 될 수 있다.

스트림

  • 입출력 장치에 데이터를 읽고 쓰기 위해서 제공하는 클래스
  • 데이터 흐름
  • 자바에선 스트림을 통해 입출력이 된다
  • 입력 스트림/출력 스트림 따로 만들어야됨
  • 다양한 장치로부터 데이터 입출력에 대해 동일한 처리 방법 제공
  • 모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림이 존재

InputStream

  • 프로그램 기준 입
  • 바이트 기반 입력 스트림의 최상위 클래스
  • 추상 클래스
  • 그림, 멀티 미디어, 문자 등 모든 데이터 입력 받을 수 있음
  • InputStream을 상속받는 클래스들은 접미사로 InputStream이 붙는다
최상위 클래스하위 클래스
InputStreamFileInputStream
InputStreamPipedInputStream
InputStreamDataInputStream
InputStreamBufferedInputStream
InputStreamStringBufferedInputStream
InputStreamObjectInputStream
  • 외부 장치로부터 바이트 단위의 데이터를 읽어 올 수 있는 read() 추상 메소드
리턴 타입메소드
intread()
intread(byte[] b)
intread(byte[] b, int off, int len)
voidclose()
  • 사용한 시스템 자원 반납 후 입력 스트림을 닫는 close() 추상 메소드가 정의

OutputSteam

  • 바이트 기반 출력 스트림의 최상위 클래스
  • 추상 클래스
  • 그림, 멀티미디어, 문자 등 모든 데이터 출력 가능
  • OutputStream을 상속받는 클래스들은 접미사로 OutputStream이 붙는
  • OutputStream을 상속받는 클래스들은 접미사로 OutputStream이 붙는다.
최상위 클래스하위 클래스
OutputStreamFileOutputStream
OutputStreamPipedOutputStream
OutputStreamDataOutputStream
OutputStreamBufferedOutputStream
OutputStreamPrintStream
OutputStreamObjectOutputStream
  • 바이트 단위의 데이터를 외부 장치에 기록할 수 있는 write() 추상 메소드가 정의되어 있다.
    리턴 타입메소드
    voidwrite(int b)
    voidwrite(byte[] b)
    voidwrite(byte[] b, int off, int len)
  • 버퍼에 잔류하는 모든 바이트를 출력하는 flush() 추상 메소드가 정의되어 있다.
  • 사용한 시스템 자원 반납 후 출력 스트림을 닫는 close() 추상 메소드가 정의되어 있다.

Reader

  • 문자 기반 입력 스트림의 최상위 클래스
  • 추상위 클래스
  • 문자는 2바이트
  • 문자 데이터만 입력받을 수 있음
  • Reader 상속받는 클래스들은 접미사로 Reader가 붙는다
최상위 클래스하위 클래스
ReaderBufferedReader
ReaderCharArrayReader
ReaderInputStreamReader
ReaderFileReader
ReaderPipedReader
ReaderStringReader
  • 외부 장치로부터 문자 단위의 데이터를 읽어 올 수 있는 read() 추상 메소드가 정의되어 있다.
리턴 타입메소드
intread()
intread(char[] c)
intread(char[] c, int off, int len)
voidclose()
  • 사용한 시스템 자원 반납 후 입력 스트림을 닫는 close() 추상 메소드가 정의되어 있다.

Writer

  • 문자 기반 출력 스트림의 최상위 클래스
  • 추상클래스
  • 문자데이터만 출력 가능
  • Writer를 상속받는 클래스들은 접미사로 Writer가 붙는다.
    최상위 클래스하위 클래스
    WriterBufferedWriter
    WriterCharArrayWriter
    WriterOutputStreamWriter
    WriterFileWriter
    WriterPipedWriter
    WriterStringWriter
  • 문자 단위의 데이터를 외부 장치에 기록할 수 있는 write() 추상 메소드가 정의되어 있다.
    리턴 타입메소드
    voidwrite(int c)
    voidwrite(char[] c)
    voidwrite(char[] c, int off, int len)
    voidwrite(String str)
    voidwrite(String str, int off, int len)
  • 버퍼에 잔류하는 모든 문자열을 출력하는 flush() 추상 메소드가 정의되어 있다.
  • 사용한 시스템 자원 반납 후 출력 스트림을 닫는 close() 추상 메소드가 정의되어 있다.

File Class

  • 파일 크기, 속성, 이름 등의 정보를 얻어내는 기능과 파일 생성 및 삭제하는 기능을 제공
  • 파일의 데이터를 읽고 쓰는 기능은 지원하지 않는다
  • 파일의 데이터를 읽고 쓰기 위해서는 파일 관련 입출력 스트림 사용해야 한다

파일 관련 입출력 스트림

FileInputStream

  • InputStream의 하위 클래스
  • 파일로부터 바이트 단위로 데이터를 입력받는 클래스
  • 그림, 오디오, 지디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능
// FileInputStream 객체가 생성될 때 파일과 직접 연결된다.
// 실제 파일이 존재하지 않으면 FileNotFoundException이 발생한다.
FileInputStream fis = new FileInputStream("C:/data/test.txt");

FileOutputStream

  • OutputStream의 하위 클래스
  • 바이트 단위로 데이터를 파일에 출력하는 클래스
  • 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일로 저장이 가능
// FileOutputStream 객체가 생성될 때 파일과 직접 연결된다.
// 실제 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓴다.
FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
// 이미 존재하는 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체를 생성한다.
FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);

FileReader

  • Reader의 하위 클래스
  • 텍스트 파일로부터 문자 단위로 데이터를 입력받는 클래스
  • 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기가 불가능
// FileReader 객체가 생성될 때 파일과 직접 연결된다.
// 실제 파일이 존재하지 않으면 FileNotFoundException이 발생한다.
FileReader fr = new FileReader("C:/data/test.txt");

FileWriter

  • Writer의 하위 클래스
  • 문자 단위로 데이터를 텍스트 파일에 출력하는 클래스
  • 텍스트가 아닌 그림, 오디오, 비디오 등의 파일에 저장이 불가능
// FileWriter 객체가 생성될 때 파일과 직접 연결된다.
// 실제 파일이 존재하지 않으면 자동으로 생성하지만 이미 파일이 존재하는 경우 파일을 덮어쓴다.
FileWriter fw = new FileWriter("C:/data/test.txt");
// 이미 존재하는 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체를 생성한다.
FileWriter fw = new FileWriter("C:/data/test.txt", true);

보조스트림

  • 보조 스트림은 기반 스트림(InputStream, OutputStream, Reader, Writer)의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용한다.
  • 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 입출력 처리 불가능하다.
  • 보조 스트림은 반드시 기반 스트림(InputStream, OutputStream, Reader, Writer)을 먼저 생성한 후 이를 이용하여 보조 스트림 생성해야 한다.

문자 변환 보조 스트림

  • 기반 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우에 사용한다.
  • InputStreamReader는 바이트 기반의 InputStream에 연결되어 문자 기반의 Reader로 변환하는 보조 스트림이다.
  • OutputStreamWriter는 바이트 기반의 OutputStream에 연결되어 문자 기반의 Writer로 변환하는 보조 스트림이다.

성능 향상 보조 스트림

  • 입출력 성능에 영향을 미치는 입출력 장치(하드디스크, 네트워크 등)를 이용하는 경우에 사용
  • 입출력 장치(하드디스크, 네트워크 등)와 직접 작업하지 않고 버퍼에 데이터를 모아 한 번에 입출력 작업을 하여 성능을 향상한다.
  • BufferedInputStream(BufferedReader)은 외부의 입력 장치로부터 데이터를 직접 읽지 않고 버퍼에 쌓아두었다가 데이터를 한 번에 읽음으로써 읽기 성능을 향상시키는 보조 스트림이다.
  • BufferedOutputStream(BufferedWriter)은 외부의 출력 장치로 데이터를 직접 출력하지 않고 버퍼에 쌓아두었다가 데이터를 한 번에 전송함으로써 출력 성능을 향상시키는 보조 스트림이다.

기본 타입 입출력 보조 스트림

  • 입출력 장치로 객체를 읽고 출력하는 경우에 사용
  • 객체는 문자 데이터가 아니므로, 출력하거나 저장하려면 바이트 형태로 직렬화해야함
    • 직렬화 : 스트림을 통해서 객체를 출력하기 위해 연속적인 데이터로 변환하는 것
    • 역직렬화 : 스트림을 통해서 읽어들인 연속적인 데이터를 객체로 복원하는 것
  • ObjectInputStream은 InputStream에 연결되어 객체를 역질렬화하는 보조 스트림
  • objectOutputStream은 OutputStream에 연결되어 객체를 직렬화하는 보조 스트림

0개의 댓글