자바 I/O에서 문자 기반 스트림의 사용이유
자바의 입출력( I/O ) 시스템은 크게 두 가지 유형의 스트림을 제공한다. 바이트 기반 스트림과 문자 기반 스트림.
문자 기반 스트림은 텍스트 데이터 (문자 데이터)를 처리할 때 사용됩니다.
1. 문자 인코딩 처리 : 문자 기반 스트림은 자동으로 플랫폼의 기분 문자 인코딩을 사용하여 문자 데이터를 올바르게 인코딩하거나 디코딩한다. 이는 다양한 문자 인코디을 처리하면서 발생할 수 있는 복잡성을 추상화하고, 개발자가 문자 데이터를 쉽게 처리할 수 있도록 돕는다.
2. 국제화 지원 : 유니코드와 같은 다국어 지원을 통해 전 세계적으로 소프트웨어를 배포할 때 필수적이다. 문자 기반 스트림을 사용하면 다양한 언어의 문자 처리가 간편해진다.
3. 가독성 및 편의성 : 문자 데이터를 읽고 쓰는 코드를 작성 할 때, 문자 기반 스트림을 사용하면 바이트를 직접 처리하는 것 보다 더 직관적이고 오류가 적은 코드를 작성할 수 있다.
문자 기반 스트림의 기본 클래스
- Reader : 문자 입력 스트림의 모든 클래스의 상위 클래스이다.
- Writer : 문자 출력 스트림의 모든 클래스의 상위 클래스이다.
문자 인코딩에 따른 바이트 수
- ASCII : 이 인코딩에서는 모든 문자가 하나의 바이트로 표현된다.
- UTF-8 : 이 인코딩은 가변 길이 문자 인코딩 방식을 사용하며, 문자에 따라 1바이트에서 4바이트까지 사용할 수 있다. 영문자 및 숫자는 일반적으로 1바이트를 사용하고, 한글이나 다른 유니코드 문자는 2바이트 이상을 사용할 수 있다.
- UTF-16 : 이 인코딩에서는 대부분의 문자가 2바이트를 사용하며, 일부 보충 문자는 4바이트를 사용한다.
- ISO-8859-1 : 이 인코딩에서는 모든 문자가 1바이트로 표현된다.
InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
InputStreamReader의 사용
InputStreamReader는 한 바이트씩 읽는게 아니라 한 번에 하나의 문자를 읽는다. 읽는 바이트 수는 사용되는 문자 인코딩에 따라 달라진다.
package io.file.ch04;
import java.io.InputStreamReader;
public class SingleCharReader {
public static void main(String[] args) {
// 문자 기반의 inputStreamReader 사용 방법
// ** 중요 **
// InputStreamReader 는 한 바이트씩 데이터를 읽는 것이 아니라
// 하나의 문자 단위로 읽는다 !!
System.out.println("문자 하나를 입력하세요");
// try catch resource
try (InputStreamReader isr = new InputStreamReader(System.in)) {
// 한 <- 통으로 읽음 -> InputStreamReader
// 한 <- 한 바이트로는 못 읽음 -> InputStream
int charData = isr.read(); // 사용자가 키보드에 값을 입력할 때 까지 대기
if (charData != -1) {
// -1 -> 파일의 끝 (EOF:End Of File) 가 아니라면 출력
// char -> 2byte (한글은 2byte로 거의 모든 글자 표현이 가능하다)
System.out.println("사용자가 입력한 값 : " + (char)charData);
}
} catch (Exception e) {
System.out.println("뭔가 잘못 되었습니다.");
e.printStackTrace();
}
}// end of main
}// end of class
BufferedReader의 사용
package io.file.ch04;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class MyBufferedReadConsoleIO {
public static void main(String[] args) {
// 문자 기반 스트림 + 보조 문자 기반 스트림을 사용한다.
try (
InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
BufferedReader br = new BufferedReader(isr)
){
// isr -> 한 문자씩 읽는 기능 read() 를 가지고 있었다.
// br -> 한 번에 한 라인씩 읽을 수 있는 기능을 가지고 있다.
System.out.println("더 많은 텍스트를 입력하세요. (한 줄 단위) -> 엔터");
// isr.read(); -> 기능 확정인
String inputUserData = br.readLine();
System.out.println("입력 확인 : " + inputUserData);
} catch (Exception e) {
e.printStackTrace();
}
}// end of main
}// end of class
BufferedReader와 기능 확장 ( while 문 사용 )
package io.file.ch04;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
// 문자 기반 스트림 + 보조 문자 기반 스트림 확인
// 현재 코드는 한 줄 입력하면 종료 됨
// 여러줄 반복적으로 동작할 수 있도록 기능을 추가해주세요.
public class StandardInputExample {
public static void main(String[] args) {
// 데이터를 통으로 관리하고 싶다면 -> 자료 구조 -> 적절한 자료 구조를 선택
List<String> lines = new ArrayList<String>();
System.out.println("여러줄의 텍스트를 입력하세요.");
System.out.println("입력을 종료하려면 빈줄에서 엔터를 누르세요.");
// 문자 기반 스트림 + 보조 문자 기반 스트림을 사용한다.
try (InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
BufferedReader br = new BufferedReader(isr)) {
// isr -> 한 문자씩 읽는 기능 read() 를 가지고 있었다.
// br -> 한 번에 한 라인씩 읽을 수 있는 기능을 가지고 있다.
// isr.read(); -> 기능 확정인
String line;
// "" 엔터 -> line.isEmpty() -> ! -> false -> 실행에 종료가 된다.
while ((line = br.readLine()) != null && !line.isEmpty()) {
lines.add(line); // 한 줄에 데이터를 자료구조에 저장
// System.out.println("입력 확인 : " + line);
}
for (String data : lines) {
System.out.println(data);
}
System.out.println("프로그램 종료 처리");
} catch (Exception e) {
e.printStackTrace();
}
}// end of main
}// end of class
내가 쓴 코드
package io.file.ch04;
import java.io.BufferedReader;
import java.io.InputStreamReader;
// 문자 기반 스트림 + 보조 문자 기반 스트림 확인
// 현재 코드는 한 줄 입력하면 종료 됨
// 여러줄 반복적으로 동작할 수 있도록 기능을 추가해주세요.
public class StandardInputExample2 {
public static void main(String[] args) {
// 문자 기반 스트림 + 보조 문자 기반 스트림을 사용한다.
try (
InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
BufferedReader br = new BufferedReader(isr)
){
boolean flag = true;
while(flag) {
// isr -> 한 문자씩 읽는 기능 read() 를 가지고 있었다.
// br -> 한 번에 한 라인씩 읽을 수 있는 기능을 가지고 있다.
System.out.println("여러줄의 텍스트를 입력하세요.");
System.out.println("입력을 종료하려면 빈줄에서 엔터를 누르세요.");
// isr.read(); -> 기능 확정인
String inputUserData = br.readLine();
System.out.println("입력 확인 : " + inputUserData);
if(inputUserData == "") {
System.out.println("종료됩니다.");
flag = false;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}// end of main
}// end of class
728x90
'Java' 카테고리의 다른 글
파일 출력 스트림 ( 문자 기반 스트림 ) (0) | 2024.05.20 |
---|---|
파일 입력 스트림 ( 문자 기반 스트림 ) (0) | 2024.05.20 |
파일 Copy ( 바이트기반 입/출력 ) (0) | 2024.05.16 |
파일 출력 스트림 ( 바이트 기반 ) (0) | 2024.05.16 |
파일 입력 스트림 ( 바이트 기반 ) (0) | 2024.05.14 |