티스토리 뷰
목표
자바의 Input과 Output에 대해 학습하기
학습할 것
-
스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
-
InputStream과 OutputStream
-
Byte와 Character 스트림
-
표준 스트림 (System.in, System.out, System.err)
-
파일 읽고 쓰기
1. 스트림 (Stream) / 버퍼(Buffer) / 채널(Channel) 기반의 I/O
[I/O]
INPUT과 OUTPUT의 약자로 입력과 출력을 나타낸다.
즉, 컴퓨터 내부 또는 외부 장치와 프로그램간의 데이터를 주고 받는 것을 말한다.
[스트림]
자바 8부터 추가된 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 도와주는 반복자이다.
Iterator와 비슷한 역할을 하는 반복자이지만, 람다식으로 요소 처리 코드를 제공하는 점과 내부 반복자를 사용하므로 병렬 처리가 쉽다는 점 그리고 중간 처리와 최종 처리 작업을 수행한다는 점에서 많은 차이를 가지고 있으며, 단방향으로 동작한다.
[NIO] = New IO
기존 자바 I/O API를 대체하기 위해 도입된 것이다.
기존 I/O API에서는 Byte와 Character 스트림을 사용했지만, NIO에서는 채널과 버퍼를 사용하게 된다.
[Channel]
NIO의 모든 I/O는 채널로 시작하며 채널 데이터를 버퍼로 읽거나 버퍼에서 채널로 데이터를 쓸 수 있다.
채널은 스트림과 유사하지만 차이점이 존재하는데 차이점은 다음과 같다.
-
채널을 통해 읽고 쓸 수 있지만, 스트림은 단방향(읽기 혹은 쓰기)만 가능하다.
-
채널은 비동기적으로 읽고 쓰는 것이 가능하다.
-
채널은 항상 버퍼에서 읽거나 버퍼로 쓴다.
[Buffer]
NIO의 버퍼는 채널과 상호작용할 때 사용되는 것으로 데이터를 쌓아두고 한번에 찾을 수 있는 데이터 공간이다.
2. InputStream과 OutputStream
프로그램이 출발지냐 또는 도착지냐에 따라 스트림의 종류가 결정되게 된다.
프로그램이 데이터를 입력받을 때에는 입력 스트림이라 부르고, 프로그램이 데이터를 보낼 때에는 출력 스트림이라 부른다.
-
입력 스트림의 출발지 : 키보드, 파일, 네트워크상의 프로그램
-
출력 스트림의 도착지 : 모니터, 파일, 네트워크상의 프로그램
항상 프로그램을 기준으로 데이터가 들어오면 입력 스트림이고, 데이터가 나가면 출력 스트림이라는 것을 명심해야 한다.
프로그램이 네트워크상의 다른 프로그램과 데이터를 교환하기 위해서는 양쪽 모두 입력 스트림과 출력 스트림이 따로 필요하다.
왜냐하면 스트림의 특성은 단방향이기 때문에 하나의 스트림으로 입력과 출력을 모두 할 수 없기 때문이다.
[InputStream]
바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.모든 바이트 기반 입력 스트림은 InputStream을 상속받아 만들어지게 된다.
리턴 타입 | 메소드 | 설명 |
int | read() | 입력 스트림으로부터 1바이트를 읽고 읽은 바이트를 리턴한다. |
int | read(byte[] b) | 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열 b에 저장하고 실제로 읽은 바이트 수를 리턴한다. |
int | read(byte[] b, int off, int len) | 입력 스트림으로부터 len개의 바이트만큼 읽고 매개값을 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 실제로 읽은 바이트 수인 len개를 리턴한다. 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수를 리턴한다. |
void | close() | 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다. |
[OutputStream]
바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.
모든 바이트 기반 출력 스트림 클래스는 이 클래스를 상속받아 만들어지게 된다.
리턴 타입 | 메소드 | 설명 |
void | write(int b) | 출력 스트림으로 1바이트를 보낸다 (b의 끝 1바이트) |
void | write(byte[] b) | 출력 스트림으로 주어진 바이트 배열 b의 모든 바이트를 보낸다. |
void | write(byte[] b, int off, int len) | 출력 스트림으로 주어진 바이트 배열 b[off]부터 len개까지의 바이트를 보낸다. |
void | flush() | 버퍼에 잔류하는 모든 바이트를 출력한다. |
void | close() | 사용한 시스템 자원을 반납하고 출력 스트림을 닫는다. |
3. Byte와 Character 스트림
데이터를 어떤 방식으로 전달하느냐에 따라 스트림은 2가지로 나눌 수 있다.
[Byte Stream]
binary 데이터를 입출력하는 스트림으로 이미지, 동영상 등을 송수신할 때 주로 사용한다.
[Character Stream]
text데이터를 입출력하는데 사용하는 스트림으로 HTML 문서, 텍스트 파일을 송수신할 때 주로 사용한다.
4. 표준 스트림(System.in, System.out, System.err)
자바에서는 콘솔로부터 데이터를 입력받을 때 System.in을 사용하고, 콘솔에 데이터를 출력할 때 System.out을 사용한다.
그리고 에러를 출력할 때는 System.err를 사용한다.
[System.in]
자바는 프로그램이 콘솔로부터 데이터를 입력받을 수 있도록 System 클래스의 in 정적 필드를 제공하고 있다.
System.in은 InputStream 타입의 필드이므로 InputStream 변수로 참조가 가능하다.
[System.out]
콘솔에서 입력된 데이터를 System.in으로 읽었다면, 콘솔로 데이터를 출력하기 위해서 System 클래스의 out 정적 필드를 사용한다.
out은 PrintStream 타입의 필드로 PrintStream이 OutputStream의 하위 클래스이다.
그러므로 out 필드를 OutputStream 타입으로 변환해 사용할 수 있다.
[System.in]
5. 파일 읽고 쓰기
IO 패키지(java.io)에서 제공하는 File 클래스는 파일 크기, 파일 속성, 파일 이름 등의 정보를 얻어내는 기능과 파일 생성 및 삭제 기능을 제공하고 있다. 그리고 디렉토리를 생성하고 디렉토리가 존재하는 파일 리스트를 얻어내는 기능도 있다.
그러나 파일의 데이터를 읽고 쓰는 기능은 지원하지 않으며 파일의 입출력의 경우 스트림을 사용해야 한다.
[파일 읽기]
파일을 읽어들이는 경우, FileReader 클래스를 사용하며 텍스트 파일을 프로그램으로 읽어들일 때 사용하는 문자 기반 스트림이다.
문자 단위로 읽기 때문에 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽을 수 없다.
다음은 FileReader를 생성하는 2가지 방법이다.
FileReader fr = new FileReader("C:/Temp/file.txt");
File file = new File("C:/Temp/file.txt");
FileReader fr = new FileReader(file);
[파일 쓰기]
파일을 저장하는 경우, FileWriter를 사용하며 텍스트 데이터를 파일에 저장할 때 사용하는 문자 기반 스트림이다.
문자 단위로 저장하기 때문에 텍스트가 아닌 그림, 오디오, 비디오 등의 데이터를 파일로 저장할 수 없다.
FileWriter fr = new FileWriter("C:/Temp/file.txt");
File file = new File("C:/Temp/file.txt");
FileWriter fr = new FileWriter(file);
위에 설명한 FileReader, FileWriter 클래스 외에 FileInputStream, FileOutputStream 클래스를 활용하면 바이트 기반 입력 스트림과 출력 스트림이기 때문에 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일을 읽을 수 있다.
사용 방법은 다음과 같다.
FileInputStream fis = new FileInputStream("C:/Temp/image.gif");
File file = new File("C:/Temp/image.gif");
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream("C:/Temp/image.gif");
File file = new File("C:/Temp/image.gif");
FileOutputStream fos = new FileOutputStream(file);
'Project > 자바 라이브 스터디' 카테고리의 다른 글
자바 라이브 스터디 #12 : 애노테이션 (0) | 2021.03.05 |
---|---|
자바 라이브 스터디 #11 : Enum (0) | 2021.03.05 |
자바 라이브 스터디 #10 멀티쓰레드 프로그래밍 (0) | 2021.01.23 |
자바 라이브 스터디 #9 예외 처리 (0) | 2021.01.15 |
자바 라이브 스터디 #7 패키지 (0) | 2020.12.31 |