본문 바로가기
Study/Java Study

자바스터디 11주차 (1) - 입출력IO

by hongchii 2021. 7. 25.
728x90
반응형

1. 자바에서의 입출력

1.1 입출력이란?

컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것

 

1.2 스트림(stream)

자바에서 입출력을 수행하기 위해 두 대상을 연결하고 데이터를 운반하는데 사용되는 연결통로

먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다.

 

1.3 바이트기반 스트림 - InputStream, OutputStream

스트림은 바이트단위로 데이터를 전송하며 입출력 대상에 따라 다음과 같은 입출력스트림이 있다.

 

[입력스트림출력스트림입출력 대상의 종류]

입력스트림 출력스트림 입출력 대상의 종류
FileInputStream FileOutputStream 파일
ByteArrayInputStream ByteArrayOutputStream 메모리(byte배열)
PipedInputStream PipedOutputStream 프로세스(프로세스간의 통신)
AudioInputStream AudioOutputStream 오디오장치

 

 

[InputStream과 OutputStream에 정의된 읽기와 쓰기를 수행하는 메서드]

InputStream OutputStream
abstract int read() abstract void write(int b)
int read(byte[] b) void write(byte[] b)
int read(byte[] b, int off, int len) void write(byte[] b, int off, int len)

 

1.4 보조스트림

실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.

 

[보조스트림의 종류]

입력 출력 설명
FilterInputStream FilterOutputStream 필터를 이용한 입출력 처리
BufferedInputStream BufferedOutputStream 버퍼를 이용한 입출력 성능향상
DataInputStream DataOutputStream int, float와 같은 기본형 단위(primitive type)로 데이터를 처리하는 기능
SequenceInputStream 없음 두 개의 스트림을 하나로 연결
LineNumberInputStream 없음 읽어 온 데이터의 라인 번호를 카운트(JDK1.1부터 LineNumberReader로 대체)
ObjectInputStream ObjectOutputStream 데이터를 객체 단위로 읽고 쓰는데 사용. 주로 파일을 이용하며 객체 직렬화와 관련 있음
없음 PrintStream 버퍼를 이용하며, 추가적인 print관련 기능(print, printf, println메서드)
PushbackInputStream 없음 버퍼를 이용해서 읽어 온 데이터를 다시 되돌리는 기능(unread, push back to buffer)

 

1.5 문자기반 스트림 - Reader, Writer

java에서는 한 문자를 의미하는 char형이 1byte가 아니라 2byte이기 때문에 바이트기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다. 이 점을 보완하기 위해서 문자기반의 스트림이 제공된다. 문자데이터를 입출력할 때는 바이트기반 스트림 대신 문자기반 스트림을 사용하자.

InputStream --> Reader OutputStream --> Writer

바이트기반 스트림과 문자기반 스트림의 읽기 쓰기에 사용되는 메서드를 비교하면 byte배열 대신 char배열을 사용한다는 것과 추상메서드로 선언된 메서드의 종류가 다르다.

보조스트림 역시 문자기반 보조스트림이 존재하며 사용목적과 방식은 바이트 기반과 다르지 않다.

2. 바이트기반 스트림

2.1 InputStream과 OutputStream

모든 바이트기반의 스트림의 조상이며 다양한 메소드가 선언되어 있다.

스트림의 종류에 따라서 mark()와 reset()을 사용하여 이미 읽은 데이터를 되돌려서 다시 읽을 수 있다. 이 기능을 지원하는 스트림인지 확인하는 markSupported()를 통해서 알 수 있다.

flush()는 버퍼가 있는 출력스트림의 경우에만 의미가 있으며, OutputSteream에 정의된 flush()는 아무런 일도 하지 않는다.

프로그램이 종료될 때, 사용하고 닫지 않은 스트림을 JVM이 자동적으로 닫아 주기는 하지만, 스트림을 사용해서 모든 작업을 마치고 난 후에는 close()를 호출해서 반드시 닫아주어야 한다. 그러나 ByteArrayInputStream과 같이 메모리를 사용하는 스트림과 System.in, System.out과 같은 표준 입출력 스트림은 닫아 주지 않아도 된다.

 

2.2 ByteArrayInputStream과 ByteArrayOutputStream

메모리, 즉 바이트배열에 데이터를 입출력 하는데 사용되는 스트림이다.

 

2.3 FileInputStream과 FileOutputStream

파일에 입출력을 하기 위한 스트림

 

3. 바이트기반의 보조스트림

3.1 FilterInputStream과 FilterOutputStream

InputStream/OutputStream의 자손이면서 모든 보조스트림의 조상으로 자체적으로 입출력을 수행할 수 없기 때문에기반 스트림이 필요하여 FilterInputStream/FilterOutputStream은 상속을 통해 원하는 작업을 수행하도록 읽고 쓰는 메서드를 오버라이딩해야 한다.

 

3.2 BufferedInputStream과 BufferedOutputStream

스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조스트림으로 한 바이트씩 입출력하는 것보다는 버퍼(바이트 배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분의 입출력 작업에 사용된다.

 

3.3 DataInputStream과 DataOutputStream

데이터를 읽고 쓰는데 있어서 byte단위가 아닌, 8가지 기본 자료형의 단위로 읽고 쓰기가 가능하다.

 

 

3.4 SequenceInputStream

여러 개의 입력스트림을 연속적으로 연결해서 하나의 스트림으로부터 데이터를 읽는 것과 같이 처리할 수 있도록 도와준다. 큰 파일을 여러개의 작은 파일로 나누었다가 하나의 파일로 합치는 것과 같은 작업을 수행할 때 사용하면 좋다.

 

메서드 / 생성자 설명
SequenceInputStream(Enumeration e) Enumeration에 저장된 순서대로 입력스트림을 하나의 스트림으로 연결한다.
SequenceInputStream(InputStream s1, InputStream s2) 두 개의 입력스트림을 하나로 연결한다.

 

3.5 PrintStream

데이터를 기반스트림에 다양한 형태로 출력할 수 있는 print, println, printf와 같은 메서드를 오버로딩하여 제공

PrintStream과 거의 같은 기능을 갖는 PrintWrite가 JDK1.1에서 부터 추가되었는데 보다 다양한 문자를 처리하는데 적합하기 때문에 가능하면 PrintWriter를 사용하는 것이 좋다.

4. 문자기반 스트림

4.1 Reader와 Writer

char 배열을 사용한 문자기반의 스트림 제공. Text의 읽기/쓰기에 특화되어있다.

 

[InputStream/OutputStreamReader/Writer]

Byte 기반 Char 기반
0 and 255 0 and 65535

 

4.2 FileReader와 FileWriter

 

4.3 PipedReader와 PipedWriter

주로 쓰레드 간에 데이터를 주고 받을 때 사용된다.

 

4.4 StringReader와 StringWriter

StringReader/Writer는 입출력 대상이 메모리인 스트림이다. 내부의 StringBuffer에 저장된다.

StringReader는 문자열 데이터를 Reader 형태로 변환해준다. 문자열 데이터를 오직 Reader를 기반으로 접근하게 변환이 필요할 경우 유용한다.

5. 문자기반의 보조스트림

5.1 BufferedReader와 BufferedWriter

BufferedReader/BufferedWriter 버퍼를 이용해서 입출력의 효율을 높일 수 있게 해주는 역할을 한다.

 

5.2 InputStreamReader와 OutputStreamWriter

Byte 기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다.

 

6. 표준입출력과 File

6.1 표준입출력 - System.in, System.out, System.err

위의 세 스트림은 JVM이 시작할때 초기화가 되므로 직접 초기화를 할 필요가 없다.

 

6.2 표준입출력의 대상변경 - setOut(), setErr(), setIn()

InputStream으로 System.in, OutputStream으로 System.out, System.err의 읽기/쓰기를 새로우 스트림으로 변경할 수 있다.

 

6.3 RandomAccessFile

입력과 출력을 하나의 클래스로 파일에 대한 입력/출력을 모두 할 수 있게 설계된 클래스. 가장 큰 장점은 파일의 어느 위치에나 읽기/쓰기가 가능하다는 점이다.

 

6.4 File

File 클래스로 통해 파일과 디렉토리를 다룰 수 있도록 제공한다

7. 직렬화(Serialization)

7.1 직렬화란?

직렬화란 객체를 데이터 스트림으로 만드는 것을 뜻한다. 객체에 저장된 데이터를 스트림에 쓰기위해 연속적인(serial) 데이터로 변환하는 것을 말한다.

자바 오브젝트를 쓰고(Serialization) 읽기(Deserializetion) 하기 위해선 Serializable 인터페이스를 구현(선언)해야한다.

 

7.2 ObjectInputStream과 ObjectOutputStream

ObjectInputStream/ObjectOutputStream은 raw 한 byte를 읽는거 대신, InputStream/OutputStream을 통해 자바 오브젝트를 읽을 수 있도록 해준다. 

 

7.3 직렬화가 가능한 클래스 만들기 - Serializable, transient

직렬화가 가능한 클래스를 만드는 방법은 Serializable 인터페이스를 원하는 클래스에 구현(선언)하면 된다.

 

7.4 직렬화가능한 클래스의 버전관리

직렬화된 객체를 역직렬화할 떄는 직렬화 했을 떄와 같은 클래스를 사용해야한다. 하지만 클래스의 내용이 변경된 경우 역직렬화에 실패한다.

728x90
반응형

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

자바스터디 후기  (0) 2021.08.12
자바스터디 12주차 (1)  (0) 2021.08.01
자바스터디 10주차 (1)  (0) 2021.07.12
자바스터디 9주차 (1)  (0) 2021.07.05
자바스터디 8주차 (2)  (0) 2021.07.04

댓글