티스토리 뷰

자바 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();
		}
		
	}

}

결과([10]으로 정했기 때문에 그 이상은 잘린다!)

 

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
댓글
최근에 올라온 글
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함