새소식

Back/Java

I/O Stream

  • -

목차


  • I/O
  • Stream
  • Buffer
  • InputStream / OutputStream
  • Reader / Writer
  • 파일 읽고 쓰기




I/O


  • I/O는 Input과 Output의 약자이다.
    • Input은 데이터를 입력 받는 것 이다.
    • Output은 데이터를 출력 하는 것 이다.
  • 프로그램의 외부에서 데이터를 조작하기 위해 사용한다.
  • 자세한 내용은 Java Api Document에서 java.io를 확인하자.




Stream


  • Stream은 데이터의 흐름이다.
    • 데이터가 시냇물처럼 한 방향으로 흐른다고 하여...
  • 단방향으로 데이터를 통신한다.
    • FIFO(First In First Out) 구조이다.
  • Stream은 통신하는 데이터의 크기에 따라 두 가지로 나뉜다.
    • ByteStream [ 1 Byte ]
    • CharacterStream [ 2 Byte ]
  • 데이터의 크기만큼 읽어서 바로 전송한다.
    • 이로 인해 외부에 요청이 많아 성능상 단점이 존재한다.
  • 스트림은 동기(순차) 방식으로 처리된다.




Buffer


  • 고속 <-> 저속 장치 간의 속도 차이를 줄여주기 위해 사용하는 임시 공간이다.
  • 데이터의 크기만큼 읽고 모아서 전송한다.
    • 이로 인해 외부에 한번에 요청하여 성능상 이점이 존재한다.
  • 데이터의 전송 시점
    • 개행문자를 만난 경우
    • 버퍼가 가득 찬 경우
    • 강제로 전송(flush) 하는 경우




InputStream / OutputStream


  • 바이트 단위의 입출력을 지원한다.
  • 바이트 기반이여서 모든 데이터를 주고 받을 수 있다.
  • InputStream과 OutputStream은 바이트 기반 Stream의 조상이다.
  • 1 Byte를 기준으로 통신한다.

하위 클래스

InputStream OutputStream
AudioInputStream AudioOutputStream
ByteArrayInputStream ByteArrayOutputStream
FileInputStream FileOutputStream
FilterInputStream FilterOutputStream
ObjectInputStream ObjectOutputStream
PipedInputStream PipedOutputStream
SequenceInputStream SequenceOutputStream
StringBufferInputStream StringBufferOutputStream




Reader / Writer


  • 문자 단위의 입출력을 지원한다.
  • 문자 기반이여서 문자만 주고 받을 수 있다.
  • Reader와 Writer는 문자 기반 Stream의 조상이다.
  • 2 Byte를 기준으로 통신한다.

하위 클래스

Reader Writer
BufferedReader BufferedWriter
CharArrayReader CharArrayWriter
FilterReader FilterWriter
InputStreamReader InputStreamWriter
PipedReader PipedWriter
StringReader StringWriter




파일 읽고 쓰기


  • 프로젝트 루트 디렉토리에 file.txt 파일을 생성하여 쓰고 읽어 본다.
  • try - catch - finally와 try - with - resources를 모두 사용해 본다.
  • File 클래스를 활용해 본다.

try - catch - finally

// try - catch - finally
InputStream inputStream = null;
OutputStream outputStream = null;

try {
  outputStream = new FileOutputStream("file.txt");
  outputStream.write(65);
  outputStream.write(66);
  outputStream.write(67);
  outputStream.write(68);
  outputStream.write(69);
}
catch (IOException e) {
  String ioExceptionMessage = e.getMessage();
  System.out.println("OutputStream IOException = " + ioExceptionMessage);
}
catch (Exception e) {
  String exceptionMessage = e.getMessage();
  System.out.println("OutputStream Exception = " + exceptionMessage);
}
finally {
  if (outputStream != null) {
    try {
        outputStream.close();
    }
    catch (IOException e) {
      String ioExceptionCloseMessage = e.getMessage();
      System.out.println("OutputStream Close IOException = " + ioExceptionCloseMessage);
    }
    catch (Exception e) {
      String exceptionCloseMessage = e.getMessage();
      System.out.println("OutputStream Close Exception = " + exceptionCloseMessage);
    }
  }
}
// =============================================================================
try {
  inputStream = new FileInputStream("file.txt");

  int readData;

  while ((readData = inputStream.read()) != -1) {
    System.out.println("readData = " + readData);
  }
}
catch (FileNotFoundException e) {
  String fileNotFoundExceptionMessage = e.getMessage();
  System.out.println("InputStream FileNotFound Exception = " + fileNotFoundExceptionMessage);
}
catch (IOException e) {
  String ioexceptionMessage = e.getMessage();
  System.out.println("InputStream Exception Message = " + ioexceptionMessage);
}
catch (Exception e) {
  String exceptionMessage = e.getMessage();
  System.out.println("InputStream Exception Message = " + exceptionMessage);
}
finally {
  if (inputStream != null) {
    try {
        inputStream.close();
    }
    catch (IOException e) {
      String ioexceptionCloseMessage = e.getMessage();
      System.out.println("InputStream Exception Message = " + ioexceptionCloseMessage);
    }
    catch (Exception e) {
      String exceptionCloseMessage = e.getMessage();
      System.out.println("InputStream Close Exception Message = " + exceptionCloseMessage);
    }
  }
}
// =============================================================================
// readData = 65
// readData = 66
// readData = 67
// readData = 68
// readData = 69

try - with - resources

try (OutputStream outputStream = new FileOutputStream("file.txt")) {
  outputStream.write(65);
  outputStream.write(66);
  outputStream.write(67);
  outputStream.write(68);
  outputStream.write(69);
}
catch (IOException e) {
  String ioExceptionMessage = e.getMessage();
  System.out.println("OutputStream IOException = " + ioExceptionMessage);
}
catch (Exception e) {
  String exceptionMessage = e.getMessage();
  System.out.println("OutputStream Exception = " + exceptionMessage);
}
// =============================================================================
try (InputStream inputStream = new FileInputStream("file.txt")) {

  int readData;

  while (true) {
      readData = inputStream.read();
      if(readData == -1)
          break;
        System.out.println("readData = " + readData);
  }

}
catch (FileNotFoundException e) {
  String ioExceptionMessage = e.getMessage();
  System.out.println("InputStream FileNotFoundException = " + ioExceptionMessage);
}
catch (IOException e) {
  String exceptionMessage = e.getMessage();
  System.out.println("InputStream ExceptionMessage = " + exceptionMessage);
}
// =============================================================================
// readData = 65
// readData = 66
// readData = 67
// readData = 68
// readData = 69




'Back > Java' 카테고리의 다른 글

Annotation  (0) 2022.08.13
Enum  (0) 2022.08.06
쓰레드  (0) 2022.07.31
예외처리  (0) 2022.07.17
인터페이스  (0) 2022.07.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.