IO

EDDIE Kim·2020년 12월 31일
0

추가지식

목록 보기
3/17

입출력

입력(input)과 출력(output) 처리

  • java.io 패키지의 클래스들로 지원함
    * 단, java 5 버전부터 java.util.Scanner 가 추가되었음(값의 자료형별 입력이 편하게 사용할 수 있게 되었음. 그 이전에는 BufferedReader등을 이용함)
  • 입출력에는 stream(통로)객체가 사용됨.

컴퓨터에서의 입출력 처리 방식

  1. Input
    읽기용 통로를 InputStream 이라고 함

    외부자원(resource) 입력용버퍼 메모리
    --------------------------------------------------->
    읽기용통로 > 버퍼에 입력된값이 기록됨 > 읽음 > 변수에기록
    --------------------------------------------------->
    키보드 ------------------ (stdin)
    디스크의 파일
    네트워크상의 다른pc
    데이터베이스 서버

  1. Output
    쓰기(출력)용 통로를 OutputStream 이라고 함

      외부자원(resource)		출력용버퍼		   메모리
      <---------------------------------------------------
    					쓰기용통로 < 버퍼에 내보낼값이 기록됨 <내보냄< 변수값읽음
      <---------------------------------------------------
       모니터 				------------------	 (stdout)
       디스크의 파일	   
       네트워크상의 다른 pc 
       데이터베이스 서버

stream(통로)는 시스템(os)가 관리하고 있음
외부 자원과의 입출력이 필요할 경우, 시스템으로 부터 스트림을 얻어와서 사용하고 난 다음 반드시 시스템으로 스트림을 반납해야 함

Stream

스트림은 단방향임(일방통행임)

  • 입력용 스트림(InputStream)
  • 출력용 스트림(OutputStream)
  • 자바에서 입/출력을 하려면, 외부자원과 스트림부터 연결시키고, 그 다음에 읽거나 쓰기를 함
    1. 스트림 클래스에 대한 객체 생성 : 외부자원과의 통로 만들기임.
    2. 스트림객체reference.읽기용메소드() 또는 스트림객체reference.쓰기용메소드() 호출

자바에서 스트림의 종류를 두 가지로 구분됨

  • 바이트(byte) 스트림 : 통로로 움직이는 데이터 크기가 1바이트임.
    사운드, 이미지, 동영상과 같은 바이너리 파일들
    기록된 정보를 정확히 볼 수는 없음
    * 네트워크 입출력은 바이트스트림만 지원됨 : 객체 전송시 객체의 직렬화가 요구됨(직렬화 Serialization : 객체 안에 기록된 각 필드값들을 1바이트단위로 쪼개서 일렬로 나열시키는 것)

  • 문자(character) 스트림 : 통로로 움직이는 데이터 크기가 2바이트임. 즉, 문자 1개씩 움직임.
    문자 저장용 문서 파일들
    기록된 정보를 볼 수 있음

@Stream구분.png 참조

  • 바이트스트림 클래스의 최상위 : InputStream / OutputStream 클래스
  • 문자스트림 클래스의 최상위 : Reader / Writer 클래스
  • 읽기용 메소드 : 버퍼에서 읽어내서 변수에 기록하는 메소드. 공통으로 read() 메소드 사용함.
  • 쓰기용 메소드 : 변수값을 버퍼에 보내서 내보내는 메소드. 공통으로 write() 메소드 사용함.

주스트림

입출력대상에 직접 연결되는 입출력스트림으로 데이터를 읽기/쓰기 위해서 반드시 사용해야 한다.

  • 파일 입출력
    FileInputStream / FileOutputStream
    FileReader / FileWriter
  • Thread 간의 입출력
    PipeInputStream / PipeOutputStream
    PipeReader / PipeWriter

보조스트림

1|2바이트 단위의 입출력보다 효율성을 보완한 스트림클래스들이 제공됨

  • 버퍼를 이용
    BufferedInputStream / BufferedOutputStream
    BufferedReader / BufferedWriter
  • 필터를 적용
    FilterInputStream / FilterOutputStream
    FilterReader / FilterWriter
  • 줄번호자동추가(행단위)
    LineNumberInputStream
    LineNumberReader
  • 객체를 입출력
    ObjectInputStream / ObjectOutputStream
    직렬화(Seriable) 처리된 객체의 입출력에 사용함
  • 데이터종류별 입출력
    DataInputStream / DataOutputStream
    주로 객체가 가진 필드값들을 데이터 종류별로 파일에 기록하거나, 읽어올 때 사용함
  • 파일 입출력 동시 처리
    * RandomAccessFile

처리(보조) 스트림들은 단독으로 객체 생성 못 함. 기본 스트림 클래스에 대한 객체를 인자로 사용해 생성할 수 있음

외부자원 > 입/출력 스트림 >> 실행중인 프로그램(프로세스)
기본 입/출력 스트림을 바로 사용할 경우, 외부 자원과의 처리 속도 차이때문에 프로세스가 기다려야 되는 문제가 생기게 됨

외부자원 >> 기본스트림 >> 보조스트림1 >> 보조스트림2 >> 프로세스
보조스트림의 사용으로 해결. 여러개의 보조스트림을 연달아 사용할 수 있음.

profile
과거 지상직 / 개발자 지망생

0개의 댓글