입출력
입출력 : I/O Input과 Output의 약자이다. 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 의미한다. 키보드로부터 입력을 받고 모니터 화면에 출력을 하는 행위도 I/O행위이다.
스트림(Stream)
자바에서의 입출력 즉 데이터를 한쪽에서 다른쪽으로 전달하려면 두 개의 대상을 연결하고 데이터를 전송할 수 있는 것이 필요하다. 이것을 스트림(Stream)이라한다.
이전에 작성한 스트림과는 다른 개념이다.
입출력에서 사용되는 스트림은 데이터를 운반하는 연결통로를 의미한다.
스트림은 한쪽방향 즉 단방향 통신만 가능하다. 그렇기 때문에 입력과 출력을 수행하기 위해서는 입력스트림(input Stream), 출력스트림(output stream) 2개의 스트림이 각각 필요하다.
스트림은 먼저보낸 데이터를 먼저 받는 FIFO 구조이다. 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다.
바이트기반 스트림 InputStream, OutputStream
스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다른 스트림을 사용한다.
파일
입력스트림 - FileInputStream
출력스트림 - FileOutputStream
메모리(byte 배열)
입력스트림 - ByteArrayInputStream
출력스트림 - ByteArrayOutputStream
프로세스(프로세스간 통신)
입력스트림 - PipedInputStream
출력스트림 - PipedOutputStream
오디오 장치
입력스트림 - AudioInputStream
출력스트림 - AudioOutputStream
입출력 대상에따라 입출력스트림 클래스가 정의되어있으며 각각 읽고 쓰는데 필요한 추상메서드들을 입출력대상에 맞게 구현해 놓았다.
읽기 쓰기 메서드
입력을 받는 InputStream에는 데이터를 읽는 read()메서드가 정의되어있다.
abstract int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
int read(byte[] b) 메서드는 내부적으로 int read(byte[] b, int off, int len) 를 호출하고 int read(byte[] b, int off, int len) 는 내부적으로 read()를 호출한다. 추상메서드 read() 는 입력스트림으로 부터 1byte를 읽어서 반환하는 메서드로 구현되어있다.
출력 스트림 OutputStream에는 데이터를 출력하는 write()메서드가 정의되어있다.
abstract void write(int b)
void write(byte [] b)
void write(byte[] b, int off, int len)
write()메서드도 마찬가지로 아래 두개의 메서드가 내부적으로 write(int b)를 사용한다.
write(int b)는 b를 출력하는 함수이다. 각각 데이터를 출력스트림으로 출력한다.
보조스트림
스트림의 기능을 보완하기 위한 보조스트림이 제공된다. 보조스트림은 데이터를 입출력하는것이아닌 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있는 역할을 한다. 보조스트림을 사용하기위해서는 입출력 스트림을 먼저 생성한 후 이것을 이용하여 보조스트림을 생성해야한다.
FileInputStream fis = new FileInputStream("test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read();
test파일을 읽는 코드이다.
파일 입력 스트림인 FileInputStream에 성능 향상을 위한 보조스트림 BufferedInputStream을 생성해준 경우이다. 보조스트림역시 InputStream과 OutputStream의 자손이므로 입출력방법이 동일하다.
보조스트림의 종류
FilterInputStream, FilterOutputStream : 필터를 이용한 입출력 처리
BufferedInputStream. BufferedOutputStream : 버퍼를 이용한 입출력 처리
DataInputStream, DataOutputStream : int, float와 같은 기본형 단위(primitive type)로 데이터를 처리하는 기능
SequenceInputStream : 두개의 데이터를 하나로 연결
LineNumberInputStream : 읽어 온 데이터의 라인 번호를 카운트
ObjectInputStream, ObjectOutputStream : 데이터를 객체단위로 읽고 쓰는데 사용. 주로 파일을 이용하며 객체 직렬화
PrintStream : 버퍼를 이용하며, 추가적인 print관련 기능
PushbackInputStream : 버퍼를 이ㅛㅇ해서 읽어온 데이터를 다시 되돌리는 기능(unread, push back to buffer)
문자기반 스트림 Reader, Writer
자바에서는 문자형인 char형이 2byte이기 때문에 바이트 기반의 스트림으로 2byte인 문자를 처리하는데 어려움이 있다.
2byte문자를 처리하기 위한 스트림이 문자기반 스트림 Reader와 Writer이다.
문자데이터를 입출력 할때는 바이트기반 스트림 대신 문자기반 스트림을 사용하는것이 좋다.
문자열 파일
입력스트림 - FileReader
출력스트림 - FileWriter
문자열 메모리(char 배열)
입력스트림 - CharArrayReader
출력스트림 - CharArrayWriter
프로세스(프로세스간 문자열 통신)
입력스트림 - PipedReader
출력스트림 - PipedWriter
문자열 버퍼 스트림
입력스트림 - StringReader
출력스트림 - StringWriter
Reader메서드
int read()
int read(char[] cbuf)
abstract int read(char[] cbuf, int off, int len)
InputStream의 read와 비슷하지만 Reader의 read()는 char배열을 인자로받아 처리한다.
Writer메서드
void write(int c)
void write(char[] cbuf)
abstract void write(char[] cbuf, int off, int len)
void write(String str)
void write(String str, int off, int len)
Writer의 write메서드의 인자로 char[]과 String을 받아서 처리한다.
문자열 기반 보조스트림
BufferedReader, BufferedWriter : 문자열기반 버퍼를 사용한다.
FilterReader, FilterWriter : 문자열기반 필터를 사용한다.
LineNumberReader : 읽어온 문자 데이터 라인 번호를 카운트한다.
PrintWriter : 버퍼를 이용하여, 추가적인 출력기능
pushbackReader : 버퍼를 이용해서 읽어온 읽어온 데이터를 다시 되돌린다.
'Programming > JAVA' 카테고리의 다른 글
바이트기반 보조스트림 (0) | 2021.09.11 |
---|---|
바이트 기반 스트림 (0) | 2021.09.10 |
그룹화와 분할 - groupingBy(), partitioningBy() (0) | 2021.09.02 |
collect() (0) | 2021.09.02 |
스트림의 최종연산 (0) | 2021.09.01 |