본문 바로가기

JAVA

I/O (Input/Output)

- 자바의 Input과 Output에 대한 학습

 

* 학습할 것

- 스트림(Stream) / 버퍼 (Buffer) / 채널(Channel) 기반의 I/O

- InputStream과 OutputStream

- Byte와 Character 스트림

- 표준 스트림(System.in, System.out, System.err)

- 파일 읽고 쓰기

 

 

  • 스트림(Stream) / 버퍼(Buffer) / 채널(Channel)

I/O란?

Input과 output의 약자로 입력과 출력을 나타냅니다.

죽, 컴퓨터 내부 똔느 외부와의 장치와 프로그램간 데이터를 주고 받는 것을 말합니다.

 

input : 데이터를 입력 받는 것

output : 입력받은 데이터를 내보내는 것

 

스트림

실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 말하며,

자바에서는 파일이나 콘솔에서의 입출력을 스트림을 통해 다룹니다.

 

스트림이란 데이터를 운반하는데 사용되는 연결통로입니다.

 

물이 한쪽 방향으로만 흐르는 것과 같이 단방향통신만 가능하기 때문에

하나의 스트림으로 입력과 출력을 동시에 처리할 수 없습니다.

입력과 출력을 동시에 처리하려면 입력스트림과 출력스트림을 각각 만들어 총 2개의 스트림이 필요합니다.

스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며

중간에 건너뜀 없이 연속적으로 데이터를 주고 받습니다.

 

* 큐(Queue)와 같은 FIFO(First In First Out)구조로 되어 있다고 생각하면 이해하기 쉽습니다.

 

NIO(new IO)

기존의 자바 IO API를 대체하기 위한 자바 1.4부터 도입이 되었습니다.

기존 IO API에서는 byte streams, character streams를 사용했지만,

NIO에서는 채널(Channel)과 버퍼(Buffer)를 사용합니다.

NIO의 주요 키워드

 

  • Channel

일반적으로 NIO의 모든 IO는 채널로 시작합니다.

채널데이터를 버퍼를 읽을 수 있고, 버퍼에서 채널로 데이터를 쓸 수 있습니다.

채널은 스트림과 유사하지만 몇 가지 차이점을 존재합니다.

- 채널을 통해서는 읽고 쓸 수 있지만, 스트림은 일반적을 단방향(읽기 혹은 쓰기)으로만 가능합니다.

- 채널은 비동기적으로 읽고 쓸 수 있습니다.

- 채널은 항상 버퍼로 읽어 들이고, 버퍼에 있는 내용을 채널에 씁니다.

 

  • Buffer

NIO의 버퍼는 채널과 상호작용할 떄 사용됩니다.

커널에 의해 관리되는 시스템 메모리를 직접 사용할 수 있는 채널에 의해 직접 read 되거나 write 될 수 있는 배열과 같은 객체 IO에서는 출력 스트림이 1바이트를 쓰면 입력 스트림이 1바이트를 읽습니다. 

이것 보다는 버퍼를 사용해서 복수 개의 바이트를 한꺼번에 입력받고 출력하는 것이 빠른 성능을 냅니다.

 

  • Selector

셀렉터를 사용하면 하나의 쓰레드가 여러 채널을 처리(handle)할 수 있습니다.

클라이언트 하나당 쓰레드 하나를 생성해서 처리하기 떄문에 쓰레드가 많이 생성될수록

급격한 성능 저하를 가졌던 단점을 개선하는 Reactor 패턴의 구현체입니다.

 

 

IO와 NIO의 차이점

*

  • InputStream과 OutStream

InputStream

바이트 기반 입력 스트림의 최상위 클래스로 추상클래스입니다.

모든 바이트 기반 입력 스트림은 이 클래스를 상속 받아서 만들어집니다.

InputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야할 메소드들이 정의되어 있습니다.

 

OutputStream

바이트 기반 출력 스트림의 최상위 클래스로 추상클래스입니다.

모든 바이트 기반 출력 스트림은 이 클래스를 상속 받아서 만들어집니다.

OutputStream 클래스에는 바이트 기반 출력 스트림이 기본적으로 가져야할 메소드가 정의되어 있습니다.

 

  • Byte와 Character 스트림

데이터를 어던 방식으로 전달하느냐에 따라 스트림은 두가지로 나뉩니다.

 

바이트 스트림(Byte Stream)

binary 데이터를 입출력하는 스트림입니다.

이미지, 동영상 등을 송수신 할 떄 주로 사용합니다.

- InputStream / OutputStream : byte 기반 input/out stream의 최고 조상

- ByteArrayInputStream / ByteArrayOuput : byte array(byte[])에 대한 데이터를 입출력하는 클래스

- FileInputStream / FileOutputStream : 파일(file)에 대한 데이터를 입출력하는 클래스

 

문자 스트림(Character Stream)

text 데이터를 입출력하는데 사용하는 스트림입니다.

HTML 문서, 텍스트 파일을 송수신할 때 주로 사용합니다.

- Reader / Writer : Character 기반 input / output stream의 최고 조상

- FileReader / FileWriter : 문자 기반의 파일을 입출력하는 클래스

 

 

  • 표준 스트림(System.in, System.out, System.err)

자바에서 미리 정의해둔 표준 입출력 클래스,

표준 입출력은 콘솔화면에서 입출력 된다고 해서 콘솔 입출력이라고도 합니다.

 

- System.in : 표준 입력용 스트림

- System.out : 표준 출력용 스트림

- System.err : 표준 오류 출력 스트림

 

표준 입출력 Method

입출력 메소드 사용시 반드시 예외 처리를 해줘야 합니다.

 

  • 파일 읽고 쓰기

파일 읽기(Read)

FileReader 객체와 BufferReader 객체가 사용됩니다.

String fileName = "C:/test.txt"; // 읽어들일 파일명

FileReader fileReader = new FileReader(fileName);
BufferedReader reader = new BufferedReader(fileReader);

String line = null;
while((line = reader.readLine()) != null) { // readLine()은 한줄 단위로 읽어들임
    System.out.println(line);
}

reader.close();

 

파일 쓰기(Write)

FileWriter 객체와 BufferWriter 객체가 사용됩니다.

String fileName = "C:/test.txt"; // 생성할 파일명
String str = "abc"               // 작성할 문자열

FileWriter fileWriter = new FileWriter(fileName);
BufferedWriter out = new BufferedWriter(fileWriter);
out.write(str);                  // 쓰기
out.newLine();                   // 줄바꾸기
out.close();

 

 

[참조]

blog.naver.com/reumongshop/222246981859

'JAVA' 카테고리의 다른 글

람다식  (0) 2021.04.15
제네릭(Generic)  (0) 2021.02.27
어노테이션  (0) 2021.02.03
Enum  (0) 2021.01.25
멀티쓰레드 프로그래밍  (0) 2021.01.19