나는매일가운데

JAVA API - java.io 본문

for JAVA/JAVA 기초

JAVA API - java.io

전로찡 2023. 1. 24. 17:12
반응형

시작하기 전...

  • JAVA Encoidng : java는 String을 처리할 때 내부에서 UTF-16으로 인코딩되어 처리된다.
  • 송수신이 필요할 경우, UTF-8로 변환하여 사용.
  • UTF-8의 경우 영어는 1Byte로 처리, 영어 이외에 문자는 3Byte로 처리하여 사용되기 때문에 한글이 깨지는 현상이 발생한다.

 

1. java.io 란?

 - java에서 입/출력을 위한 방법, 도구들을 객체화 시켜 모아둔 class 집합체

 - InputStream, OutputStream, Writer, Reader 등으로 구성되어 있다.

 

2. InputStream, OutStream

(1) Stream이란??

<출처 : 점프 투 자바>

 - 즉, 입력 장치(키보드 등)와 프로그램, 프로그램과 출력장치 (모니터 등)를 연결시켜 주는 통로를 말한다.

 

(2) InputStream (OutputStream)

 - InputStream 계열 최상위 class  => 이는 java API에서 Hirachy 구조를 살펴보면 확인할 수 있다. (OutputStream도 동일하다)

inputStream 계열 중 BufferedInputStream class

 - 문자를 1byte 단위로 처리를 한다 => 한글과 같은 다른 문자들은 2byte이상이기 때문에, 출력시 깨지는 현상이 발생한다.

package ioTest.one;

import java.io.*;		// io package를 사용하기 위해 import 사용

public class InputTest {

	public static void main(String[] args) {
		
		try {
			InputStream inputStram = System.in;
		
			System.out.println("입력 기다립니다...");
		
		
			
			while(true) {
				int i = inputStram.read();		// byte 단위 Encoding 되기 때문에 int로 받아줌
				char c = (char)i;				// 받은 i를 다시 decoding하기 위해 char로 받고 출력
				
				System.out.println("입력한 값 : "+c);
				
				if(c=='x') {
					inputStram.close();
					break;
				}
			}
		}catch(IOException e) {
			e.printStackTrace();
		}

	}

} // end of class

- 입력 결과를 보듯, 한글은 2byte로 처리하는것을 알 수 있다.

- 이러한 바이트 단위로 주고 받는 InputStream / OutputStream 계열을 바이트 스트림이라고도 한다.

- 만약 100개의 문자를 입력받고 싶으면 100개의 변수를 선언하거나, 바이트 타입 배열을 선언하고, read method로 처리하는 방법도 있지만, 이는 메모리상으로 불리하게 작용한다.

 

3. Reader (Writer)

 - 2byte 이상의 문자를 처리하기 위해 I/O Stream 계열을 보완하여 만들어낸 JAVA의 API

 -  문자 단위로 처리하기 때문에 메모리상으로 유리하다.

 - 무엇보다 한글 깨짐 현상을 극복할 수 있게 되었다.

 

package ioTest.one;

import java.io.*;

public class WriterTest {

	public WriterTest() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		try {
			InputStream ips = System.in;
			Reader reader = new InputStreamReader(ips); // = new InputStreamReader(System.in);
			
			OutputStream ops = System.out;
			Writer writer = new OutputStreamWriter(ops); // = new OutputStreamWriter(System.out);
			
			System.out.println("입력 대기 중...");		// 기본적으로 Input/OutputStream으로 입출력
            											//Input/OutputStreamReader로 Wrapping (byte -> char형태)
			
			while (true){
				int i = reader.read();
				writer.write(i);
				writer.flush(); 	// flush()를 통해 입력받은 내용을 바로 출력
				
				if ((char)i == 'x') {
					break;
				}
			}
			
			//writer.flush();		// loop 밖으로 작성시, Loop가 끝나고 입력받은 내용을 모두 출력
			
			reader.close();
			writer.close(); // 입출력이 끝났으면, stream을 끊어주어 메모리 누수 방지 => 끊어주지 않으면 계속 연결상태 유지
							// 파일 복사, 이동 시 문제 발생의 원인
			
		}catch(IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}// end of main

}// end of class

출력 결과

반응형