본문 바로가기

Java

Java 입출력(I/O)

 

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

- 자바에서는 java.io 패키지를 통해서 많은 종류의 입출력 관련 클래스들을 제공함

 

 

1. 스트림(stream)

- 자바에서 입출력을 수행(데이터 운반)에 사용되는 연결통로

- 스트림은 단방향 통신만 가능, 그러므로 입출력을 동시에 사용하기 위해서는 2개의 스트림 필요

- 스트림은 먼저 보낸 데이터를 먼저 받음(큐의 FIFO구조 같은 형태)

- 중간에 건너뜀 없이 연속적으로 데이터를 주고 받음

 

 

2. 바이트 기반 스트림

- 바이트 단위로 데이터를 전송

- 입출력 대상과 입/출력 목적에 따라 해당 스트림을 선택해서 사용

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

 

1) 입력 스트림(InputStream)

메서드명 설명
int available() 스트림으로부터 읽어 올 수 있는 데이터 크기 반환
void close() 스트림을 닫고 사용하던 자원 반환
boolean markSupported() - mark()와 reset() 지원 여부 반환
- mark()와 reset() 기능 지원은 선택적이므로 사용 전 확인 필수
void mark(int readlimit) 현재 위치 표시, 후에 reset()에 의해 표시해 놓은 위치로 돌아갈 수 있음
void reset() 스트림에서의 위치를 마지막으로 mark()가 호출되었던 위치로 되돌림
abstract int read() - 1byte를 읽어옴(0~255사이의 값)
- 더이상 읽어올 데이터가 없을 시 -1 반환
- abstract메서드이기 때문에 상황에 맞게 구현하여 사용해야함
int read(byte[] b) - 배열 b의 크기만큼 읽어서 배열을 채우고 읽어 온 데이터 수 반환
- 반환하는 값은 항상 배열의 크기보다 작거나 같음
int read(byte[] b, int off, int len) - 최대 len개의 byte를 읽어서 배열 b의 지정된 위치 off부터 저장
- 실제로 읽어 올 수 있는 데이터가 len개보다 적을 수 있음
long skip(long n) 스트림에서 주어진 길이 n만큼 건너뜀

 

 

2) 출력 스트림(OutputStream)

메서드명 설명
void close() 입력 소스를 닫고 사용하던 자원 반환
void flush() - 스트림의 버퍼에 있는 모든 내용을 출력 소스에 씀
- 버퍼가 있는 출력 스트림 스트림만 해당
abstract void write(int b) 주어진 값을 출력 소스에 씀
void write(byte[] b) 주어진 배열 b에 저장된 모든 내용을 출력 소스에 씀
void write(byte[] b, int off, int len) 주어진 배여 b에 저장된 내용 중 off번째부터 len개 만큼만 읽어서 출력 소스에 씀

 

 

3) 보조 스트림

- 실제 데이터를 주고받는 스트림이 아닌 스트림의 기능을 보완하기 위한 보조 스트림(스트림 생성 후 보조 스트림 생성해야 함)

- 스트림의 기능 향상 및 새로운 기능 추가할 수 있음

- 보조 스트림도 InputStream과 OutputStream의 자손

- 바이트 기반 보조 스트림의 종류

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

 

 

3. 문자 기반 스트림

- 문자 데이터를 입출력할 때 사용

- Java는 char형이 2byte이기 때문에 바이트 기반의 스트림으로 처리하는데 어려움이 있는데 이를 2byte로 스트림을 처리해줌

- 여러 종류의 인코딩(encording)과 자바에서 사용하는 유니코드(UTF-16)간 변환을 자동으로 처리해줌

- 입출력 대상과 입/출력 목적에 따라 해당 스트림을 선택해서 사용

입출력 대상 입력 스트림 출력 스트림
파일 FileReader FileWriter
메모리(byte배열) CharReader CharWriter
프로세스(프로세스 간 통신) PipedReader PipedIWriter
오디오 장치 AudioReader AudioWriter

 

1) Reader

메서드명 설명
abstract void close() 출력 스트림을 닫음, 사용하던 자원 반환
boolean markSupported() mark()와 reset() 지원 여부 반환
void mark (int readlimit) 현재위치 표시, 후에 reset()에 의해 표시해 놓은 위치로 돌아갈 수 있음
void reset() 입력 소스 위치를 마지막으로 mark()가 호출되었던 위치로 되돌림 
int read() - 입력 소스로부터 하나의 문자를 읽어옴
- char의 범위(0 ~ 65535)의 정수를 반환, 입력 스트림의 마지막 데이터에 도달 시 -1 반환
int read(char[] c) - 입력 소스로부터 매개변수로 주어진 배열 c의 크기만큼 읽어서 배열 c에 저장
- 읽어온 데이터의 개수 또는 -1 반환
abstract int read(char[] c, int off, int len) - 입력 소스로부터 len개의 문자를 읽어서 배열 c의 지정된 위치 off부터 저장
- 읽어온 데이터의 개수 또는 -1 반환
int read(CharBuffer target) 입력 소스로부터 읽어서 문자 버퍼 tartget에 저장
boolean ready() 입력 소스로부터 데이터를 읽을 준비가 되었는지 여부 반환
long skip(long) 현재 위치에서 주어진 문자수 n 만큼 건너 뜀

 

 

2) Writer

메서드명 설명
Writer append(char c) 지정된 문자를 출력 소스에 출력
Write append(CharSequence c) 지정된 문자열 CharSequence를 출력 소스에 출력
Write append(CharSequence c, int start, int end) - 지정된 문자열 CharSequence의 일부를 출력 소스에 출력
- CharBuffer, String, StringBuffer가 CharSequence를 구현
abstract void close() 출력 스트림을 닫음, 사용하던 자원 반환
abstract void flush() - 스트림의 버퍼에 있는 모든 내용을 출력 소스에 씀
- 버퍼가 있는 스트림만 해당
void write(int b) 주어진 값을 출력 소스에 씀
void write(char[] c) 주어진 배열 c에 저장된 모든 내용을 출력 소스로 씀
abstract void write(char[] c, int off, int len) 주어진 배열 c에 저장된 내용 중 off 번 째부터 len 길이 만큼 출력 소스에 씀
void write(String str) 주어진 문자열 str을 출력 소스에 씀
void write(String str, int off, int len) 주어진 문자열 str의 일부 중 off 번 째부터 len 길이 만큼 출력 소스에 씀

 

 

3) 문자 기반 보조 스트림

입력 보조 스트림 출력 보조 스트림 설명
FilterReader FilterOutputStream 필터를 이용한 입출력 처리
BufferedReader BufferedOutputStream 버퍼를 이용한 입출력 처리
LineNumberReader 없음 읽어 온 데이터 라인 번호 카운트
없음 PrintWriter 버퍼 이용, 추가적인 print관련 기능(prin, printf, println 메서드)
PushbackReader 없음 버퍼 이용해 읽어온 데이터를 다시 되돌리는 기능(unread)

 

 

 

 

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/package-summary.html

 

java.io (Java SE 11 & JDK 11 )

 

docs.oracle.com

 

'Java' 카테고리의 다른 글

[Java] 문자열 비교 == 과 equals()  (0) 2023.09.02
Java 네트워킹(networking)  (0) 2023.01.26
Java Optional<T>  (0) 2023.01.20
Java 스트림(stream)  (0) 2023.01.20
Java 람다(Lambda)  (0) 2023.01.17