[Java] 자바 I/O 에 대한 이해 (1)


♦ 자바 I/O 의 개요
I/O 용어 정리
자바 I/O 의 기준은 항상 자바 애플리케이션이다.

소스자바 애플리케이션목적지

소스(source)
자바 애플리케이션에서 데이터를 읽어 들이는 대상을 의미한다. 키보드, 파일, 네트워크 등이 있다.

목적지(destination)
자바 애플리케이션에서의 데이터 출력 대상을 의미한다. 모니터, 파일, 네트워크 등이 있다.

입력(input)
소스에서 자바 애플리케이션으로 데이터를 읽어 들이는 작업을 의미한다. 입력 스트림(input stream) 이라고 한다.

출력(output)
자바 애플리케이션에서 목적지로데이터를 출력시키는 작업을 의미한다. 출력 스트림(output stream) 이라고 한다.

 

자바의 I/O 데이터 종류
byte
자바의 입력 및 출력 데이터로 byte 처리가 가능하다. 이미지 파일등과 같은 바이너리 위주의 데이터 입출력시 사용 가능하다.

char
자바의 입력 및 출력 데이터로 char 처리가 가능하다. 텍스트 위주의 데이터 입출력시 사용 가능하다.

 

자바의 I/O 클래스 계층구조
처리되는 데이터의 종류에 따라 다음과 같은 클래스가 제공된다.

byte 로 처리하는 클래스의 계층구조
입력을 담당하는 최상위 클래스는 InputStream 이고
출력을 담당하는 최상위 클래스는 OutputStream 이다.

두개의 클래스는 모두 추상클래스이기 때문에 직접 사용하지 않고 일반적으로 하위클래스를 이용한다.
계층구조에서 보듯이 입력과 출력은 항상 쌍으로 제공된다.

 

char 로 처리하는 클래스의 계층구조
입력을 담당하는 최상위 클래스는 Reader 이고
출력을 담당하는 최상위 클래스는 Writer 이다.

 

♦ 자바의 표준 입출력
자바의 표준 입력은 키보드에서 입력한 데이터를 읽어 들이는 작업을 의미한다.
자바의 표준 출력은 모니터로 데이터를 출력하는 작업을 의미한다.
표준 입력과 출력을 담당하는 클래스는 java.lang.System 클래스이다.

System 클래스 3가지 변수

static InputStream in
static PrintStream out
static PrintStream err

 

System.in
표준 입력으로 키보드에서 데이터를 읽어 들일 때 사용한다.

in 의 데이터형은 InputStream 이다. 이것은 키보드에서 읽어 들이는 데이터의 종류가 기본적으로 byte 로 처리된다는 것을 의미한다.

InputStream 클래스의 메소드

리턴형 메소드 설명
int read() 스트림 데이터 1byte 를 읽는다. 문자로 읽으려면 char 로 형변환 해야 한다.
int read(byte[]b) 읽은 데이터를 지정된 byte 배열에 저장하고 읽은 개수를 반환한다.
int read(byte[]b, int start, int length) length 크기만큼 읽어서 지정된 byte 배열의 start 위치에 저장한다.
void close() 입력스트림을 닫는다.

System.out
표준 출력으로서 모니터로 데이터를 출력할 때 사용한다. out 의 데이터형은 PrintStream 이다.PrintStream 클래스의 출력 메소드로 print 및 println 오버로딩 메소드가 제공된다.

System.err
표준 에러로서 모니터에 에러정보를 출력할 때 사용한다. 일반적으로 System.out 을 이용해서 에러정보를 출력하기 때문에 거의 사용되지 않는다.

 

키보드에서 입력된 데이터 처리1

import java.io.IOException;
import java.io.InputStream;

public class Test01 {
	public static void main(String[] args) {
		try {
			System.out.println("데이터를 입력하세요 ");
			InputStream is = System.in;
			int n = is.read();
			System.out.println("입력값 : " + (char) n);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

read() 메소드 사용
입력된 모든 데이터를 출력하지 못한다.
byte 로 처리 되기 때문에 char 로 형변환 해야 한다.

 

 

키보드에서 입력된 데이터 처리2

import java.io.IOException;
import java.io.InputStream;

public class Test02 {
	public static void main(String[] args) {
		try {
			byte[] b = new byte[5];
			System.out.println("데이터를 입력하세요 ");
			InputStream is = System.in;
			int n = is.read(b);
			System.out.println("입력개수 : " + n);
			for (byte bt : b) {
				System.out.println("입력 값 : " + (char) bt);
			}
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

byte 배열을 이용하여 배열 크기까지는 입력한 데이터를 처리할 수 있다.

 

 

키보드에서 입력된 데이터 처리3

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test03 {
	public static void main(String[] args) {
		try {
			System.out.println("데이터를 입력하세요 ");
			InputStream is = System.in;
			InputStreamReader reader = new InputStreamReader(is);
			int n = reader.read();
			System.out.println("입력값 : " + (char) n);
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

한글은 2byte 이기 때문에 char 로 처리하는 것이 효율적이다.
InputStreamReader 클래스의 read 메소드는 char 단위로 처리한다.

 

 

키보드에서 입력된 데이터 처리4

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test04 {
	public static void main(String[] args) {
		try {
			System.out.println("데이터를 입력하세요 ");
			InputStream is = System.in;
			InputStreamReader reader = new InputStreamReader(is);
			BufferedReader buffer = new BufferedReader(reader);
			String str = buffer.readLine();
			System.out.println("입력값 : " + str);
			buffer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

입력데이터를 한 라인씩 처리하는 BufferedReader 클래스의 readLine() 메소드를 사용한다.
데이터를 String 으로 처리한다.

자바 I/O 에 대한 이해 (2) 에서 이어집니다..

바로가기 >> [Java] 자바 I/O 에 대한 이해 (2)

답글 남기기