목표
자바의 Input과 Ontput에 대해 학습하세요.
학습할 것 (필수)
- 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
- InputStream과 OutputStream
- Byte와 Character 스트림
- 표준 스트림 (System.in, System.out, System.err)
- 파일 읽고 쓰기
마감일시
2021년 2월 20일 토요일 오후 1시까지.
늦은 스터디 참가.....(거의 1년만)
지금이라도 스터디를 끝내 보려고 한다.
스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O
스트림이란?
자바에서 입출력을 수행하려면(=즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면), 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의했다.
스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.
버퍼란?
버퍼란 primitive한 데이터를 담아두는 컨테이너이다.
버퍼는 메모리에 직접할당 하므로 최초 크기 할당 후 변경이 불가능하다.
일반적인 입출력과 다르게 버퍼라는 메모리 공간에 저장한 뒤에(할당된 만큼), 한 번에 전송한다고 생각하면 된다.
Direct Buffer vs NonDirect Buffer
사용하는 메모리 공간의 차이
Direct Buffer : OS의 메모리 공간을 직접 사용한다. (바이트 버퍼만 Direct Buffer가 존재)
NonDirectBuffer : JVM안의 Heap 영역을 사용한다.
채널 기반의 I/O란? = 자바 NIO
기존 Stream은 단방향으로 동작하였으나
채널은 양방향으로 동작 가능하며, 하나의 채널에 read, write메소드가 모두 동작한다.
InputStream과 OutputStream(바이트 기반의 스트림)
바이트 단위로 데이터를 전송하며 입출력 대상에 따라 아래와 같은 입출력 스트림이 있다.
FileInputStream(FileOutputStream)
ByteArrayInputStream(ByteArrayOutputStream)
PipedInputStream(PipedOutputStream)
AudioInputStream(AudioOutputStream)
이들 모두 InputStream과 OutputStream의 자손이며, 각각 읽고 쓰는데 필요한 추상 메서드를 구현해 놓았다.
- abstract int read() : InputStream에서 한 바이트를 읽어서 int 값으로 반환
- int read(byte[] b) : 배열의 b의 크기만큼 읽어서 배열을 채우고 읽어 온 데이터의 수를 반환한다.
- int read(byte b, int off, int len) : len 크기의 byte를 읽어서, 배열 b의 off위치부터 저장하고, 읽은 바이트 수 반환
- abstract void write(int b) : 주어진 값을 출력 소스에 write한다.
- void write(byte[] b) : 배열 b에 저장된 모든 내용을 출력 소스에 write한다.
- void write(byte[] b, int off, int len) : 배열b의 시작 off부터 len만큼 읽어서 출력 소스에 write한다.
Byte와 Character 스트림
Byte스트림이란?
스트림은 바이트 단위로 데이터를 전송하며 입출력 대상에 따라 여러 입출력 스트림이 있다.
바이트 단위라 함은 입출력의 단위가 1byte라는 뜻이다.
Character(문자) 스트림이란?
자바에서는 문자를 의미하는 char형이 1byte가 아닌 2byte이기 때문에 바이트 기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다. 이를 보완하기 위해 문자 기반의 스트림이 등장하였다.
문자 기반의 스트림은 조상이 Reader와 Writer이다.
표준 스트림 (System.in, System.out, System.err)
자바에서는 표준 입출력(standard I/O)를 위해 3가지 입출력 스트림을 제공한다.
public final class System {
public static final InputStream in;
public static final PrintStream out;
public static final PrintStream err;
....
}
System.in : 콘솔로부터 데이터를 입력받는 데 사용
System.out : 콘솔로부터 데이터를 출력하는 데 사용
System.err : 콘솔로 데이터를 출력하는데 사용(콘솔에 빨간 글씨로 출력됨)
파일 읽고 쓰기
파일 읽기
public class Reader {
public static void main(String[] args) throws FileNotFoundException {
BufferedReader br = new BufferedReader(new FileReader("c:/Users/VIP/reader.txt"));
String str = "";
try {
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
파일 쓰기
public class Writer {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("c:/Users/VIP/writer.txt"));
bw.write("write 테스트입니다.");
bw.flush();
bw.close();
}
}
Reference
자바의 정석
'Java' 카테고리의 다른 글
스터디할래 15주차 과제: 람다식(feedback, 피드백) (0) | 2021.03.06 |
---|---|
스터디할래 13주차 과제: I/O(feedback, 피드백) (0) | 2021.03.06 |
스터디할래 14주차 과제: 제네릭 (0) | 2021.03.06 |
(스터디 할래) 15주차 과제: 람다식 (0) | 2021.03.05 |
스터디 할래 14주차 과제: 제네릭(feedback, 피드백) (0) | 2021.02.28 |