티스토리 뷰
자바 I/O Input / Output
java.io 패키지의 클래스 모음으로 자바에서 각종 입출력을 담당한다.
Node(노드)
자바에서 입출력을 수행하는 대상
- 입력 노드 : 키보드, 마우스, 파일, 네트워크, 데이터베이스 등
- 출력 노드 : 모니터, 스피커, 파일, 네트워크, 데이터베이스 등
Stream(스트림)
입력 또는 출력 데이터가 한 방향으로 끊임없이 전송되는 것 (출발지 노드 -> 도착 노드)
- 입력 스트림 : 자바에서 데이터가 입력될 때 처리하는 스트림
- 출력 스트림 : 자바에서 데이터가 출력될 때 처리하는 스트림
스트림 종류
1. byte 기반(단위) 스트림 : 그림, 사진, 영상 등 바이너리(Binary) 데이터를 입출력
InputStream, OutputStream을 최상위 클래스 / XXXInputStream, XXXOutputStream 하위 클래스
2. char 기반(단위) 스트림 : 문자 데이터(텍스트)를 입출력
Reader, Writer 최상위 클래스 / XXXReader, XXXWriter 하위 클래스
- 표준 입출력 : 컴퓨터에서 기본적으로 사용하는 입출력(표준 입력 장치 - 키보드, 표준 출력 장치 - 모니터)
System - 표준 입출력을 담당하는 클래스
1. System.in : 표준 입력을 담당 (키보드에서 입력 받기 가능)
2. System.out : 표준 출력을 담당 (모니터로 출력 가능)
3. System.err : 모니터에 에러 정보 출력 (잘 사용하지 않음)
try ~ resource 구문
자원 반환(close())을 자동으로 수행
반환할 자원을 갖는 객체를 생성하고 try ~ catch 블록 작업이 끝나면 자동으로 자원을 반환하도록 한다.
try (자원을 반환할 객체 생성 및 변수에 저장) {
// 작업 수행
} catch(...) {
// 예외 처리 작업 수행
}
키보드로 데이터를 입력 받아 처리하는 방법
1. InputStream 객체를 사용해 1Byte 단위로 입력 데이터를 처리하는 방법 (byte)
- read() 메서드를 사용해 1Byte 만큼의 데이터를 가져올 수 있다.
- 아무리 많은 데이터가 입력돼도 read() 메서드는 한번에 1Byte만 처리되므로 더 많은 데이터나 큰 단위 처리가 불가능
try(InputStream i = System.in) {
int n = i.read();
System.out.println("입력 데이터 : " + n);
} catch (IOException e) {
e.printStackTrace();
}
2. InputStream 객체의 배열을 사용해 한번에 여러 Byte를 모아서 처리하는 방법 (byte[ ])
- read(byte[ ] b) 메서드를 호출(오버라이딩)하여 입력데이터를 배열크기만큼 읽어와서 저장
- 많은 데이터가 입력돼도 배열 크기만큼만 다룰 수 있다.
try(InputStream i = System.in){
byte[] bArr = new byte[10];
int n = i.read(bArr);
while(n > 0) {
String str = new String(bArr);
System.out.println("입력데이터(문자열) : " + str);
n = i.read();
}
} catch (IOException e) {
e.printStackTrace();
}
3. InputStreamReader 객체를 사용하여 char 단위로 입력데이터를 처리하는 방법 (char)
- InputStream 객체를 파라미터로 갖는 InputStreamReader 객체 생성
=> 보조 스트림을 사용하는 스트림 체이닝 방식 문법으로 구성
- read() 메서드를 호출해 입력데이터를 char단위(2Byte)만큼 읽어와서 저장(데이터 한 글자만 가능)
읽어온 데이터를 문자로 변환하는 후속작업이 필요하다.
- InputStream 보다는 유용하나 여전히 낮은 수준의 입력 처리 방식이다.
InputStreamReader reader = new InputStreamReader(InputStream 객체);
4. InputStreamReader 객체로
char 단위로 읽어온 데이터를 배열을 사용해 한번에 여러 문자로 모아 처리하는 방법 (char[ ])
import java.io.IOException;
import java.io.InputStreamReader;
public class Practice4 {
public static void main(String[] args) {
System.out.println("데이터를 입력하세요");
try(InputStreamReader reader = new InputStreamReader(System.in)) {
// 여러 char 단위 데이터를 저장할 char[] 배열을 생성한다
char[] chArr = new char[10];
int n = reader.read(chArr);
System.out.println("입력데이터(문자열) : " + new String(chArr));
} catch(IOException e) {
e.printStackTrace();
}
}
}
5. BufferedReader 객체를 사용해 String 단위로 입력 데이터를 처리하는 방법
- InputStream 객체를 파라미터로 갖는 InputStreamReader 객체 생성 후
다시 InputStreamReader 객체를 파라미터로 갖는 BufferedReader 객체 생성
Scanner가 간단하지만 속도가 느려지면 이걸 사용!
// 1. 기본 입력스트림 객체(InputStream) 생성 = byte 단위 처리
InputStream is = System.in;
// 2. 입력 스트림을 연결하는 보조스트림 InputStreamReader 객체 생성 = char 단위 처리
InputStreamReader reader = new InputStreamReader(is);
// 3. 향상된 입력 보조스트림 BufferedReader 객체 생성 = String 단위 처리
BufferedReader buffer = new BufferedReader(reader);
// 위 문장들을 하나의 문장으로 결합
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
모니터로 데이터를 출력하는 방법
1. 기본 출력스트림인 OutputStream 사용(byte 단위로 처리)
- write() 메서드를 호출해 byte단위 출력한다.
- byte 단위로 처리되므로 문자열 데이터 자체를 처리할 수 없다.
// OutputStream 객체를 연결하기 위해서 System.out 사용
OutputStream os = System.out;
char ch = 'A';
try(OutputStream os = System.out) {
// write() 메서드 호출해 1byte 데이터 출력
os.write(ch);
// 1byte 단위로 출력하므로 한글, 한자 등 출력 불가능
} catch (IOException e) {
e.printStackTrace();
} // A 출력
BufferedReader와 OutputStream을 사용해 입력받은 문자열을 출력
try(BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
OutputStream os = System.out) {
String str = buffer.readLine();
os.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
try() 문장 소괄호 내 복수 개의 객체를 세미콜론으로 구분하여 전달이 가능하다!
2. OutputStreamWriter 사용 (char 단위로 처리)
write() 메서드를 호출하여 char[] 배열 또는 String 객체를 전달하여 문자 데이터 출력 가능
=> String 클래스는 char[] 배열로 관리되므로 Writer 계열에서 처리가 가능하다.
- 데코레이션 패턴을 활용하기 위해 BufferedWirter 객체 사용 가능
OutputStreamWriter 보다 BufferedWriter 처리 속도가 빠르다!
try(OutputStreamWriter writer = new OutputStreamWriter(System.out)) {
String str = "Hello!";
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
}
// new BufferedReader(new InputStreamReader(System.in));
try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out))) {
String str = "Hello!";
writer.write(str);
} catch (IOException e) {
e.printStackTrace();
}
'배운 것 기록 > java' 카테고리의 다른 글
Swing (0) | 2022.07.18 |
---|---|
DecimalFormat, MessageFormat 클래스 (0) | 2022.07.16 |
BigInteger, BigDecimal 클래스 (0) | 2022.07.12 |
Formatting - SimpleDataFormat, DateTimeFormatter (0) | 2022.07.11 |
람다식 표현과 this (0) | 2022.07.02 |