- [Java] 84. 문자 기반 스트림2024년 05월 17일
- Song hyun
- 작성자
- 2024.05.17.:00
728x90반응형[Java] 84. 문자 기반 스트림
1. 문자 기반 스트림이란?
2. 문자 인코딩에 따른 바이트 수
1. 문자 기반 스트림이란?
(1) 자바의 입출력(I/O) 시스템은 크게 두 가지 유형의 스트림을 제공합니다 바이트 기반 스트림과 문자 기반 스트림.
문자 기반 스트림은 텍스트 데이터(문자 데이터)를 처리할 때 사용됩니다.
(2) 문자 기반 스트림의 특징:
- 문자 인코딩 처리: 문자 기반 스트림은 자동으로 플랫폼의 기본 문자 인코딩을 사용하여 문자 데이터를 올바르게 인코딩하거나 디코딩합니다. 이는 다양한 문자 인코딩을 처리하면서 발생할 수 있는 복잡성을 추상화하고, 개발자가 문자 데이터를 쉽게 처리할 수 있도록 돕습니다.
- 국제화 지원: 유니코드와 같은 다국어 지원을 통해 전 세계적으로 소프트웨어를 배포할 때 필수적입니다. 문자 기반 스트림을 사용하면 다양한 언어의 문자 처리가 간편해집니다.
- 가독성 및 편의성: 문자 데이터를 읽고 쓰는 코드를 작성할 때, 문자 기반 스트림을 사용하면 바이트를 직접 처리하는 것보다 더 직관적이고 오류가 적은 코드를 작성할 수 있습니다.
-표준 입출력을 사용시, 영어는 괜찮지만 한글 사용 시 깨짐이 발생한다.
-1Byte로는 한글을 표현할 수 없다.
2. 문자 인코딩에 따른 바이트 수
- ASCII: 이 인코딩에서는 모든 문자가 하나의 바이트로 표현됩니다.
- UTF-8: 이 인코딩은 가변 길이 문자 인코딩 방식을 사용하며, 문자에 따라 1바이트에서 4바이트까지 사용할 수 있습니다. 영문자 및 숫자는 일반적으로 1바이트를 사용하고, 한글이나 다른 유니코드 문자는 2바이트 이상을 사용할 수 있습니다.
- UTF-16: 이 인코딩에서는 대부분의 문자가 2바이트를 사용하며, 일부 보충 문자는 4바이트를 사용합니다.
- ISO-8859-1: 이 인코딩에서는 모든 문자가 1바이트로 표현됩니다.
3. 문자 기반 스트림 예제
(1) 문자 기반 스트림을 사용해보자.
package io.ch04; import java.io.InputStreamReader; public class SingleCharRead { public static void main(String[] args) { // 문자 기반의 InputStreamReader 사용 방법 // ** 중요 ** // InpustStreamReader는 한 바이트씩 데이터를 읽는 것이 아니라, // 하나의 문자 단위로 읽습니다!! System.out.println("문자 하나를 입력 하세요"); // try-catch resource 문법 try(InputStreamReader isr = new InputStreamReader(System.in)){ // 한 <-- 통으로 읽음 --> InputStreamReader // 한 <-- 한 바이트로는 못 읽음 --> InputStreamReader int charData=isr.read();// 사용자가 키보드에 값을 입력할 때까지 대기 if(charData != -1) { // -1 --> 파일의 끝을 나타냄(EoF) // char --> 2 byte 크기 (한글을 포함해 거의 모든 글자 표현이 가능하다.) System.out.println("사용자가 입력한 값 : "+(char)charData); } } catch (Exception e) { System.out.println("뭔가 잘못 되었습니다."); e.printStackTrace(); } } }
(2) 문자 기반 스트림과 보조 스트림을 함께 사용해보자.
package io.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); BufferedReader br = new BufferedReader(isr);){ // isr(기반) -> 한 문자씩 읽는 기능인 read() 가지고 있었다. // br(보조) -> 한 번에 한 라인씩 읽을 수 있는 기능이 있다. System.out.println("더 많은 텍스트를 입력하세요.(한 줄 단위=엔터)"); // isr.read(); --> 말고 기능의 확장을 활용 String inputUserData = br.readLine(); System.out.println("입력 확인 : "+inputUserData); } catch (Exception e) { // TODO: handle exception } } }
(3) 계속 반복해서 입력받고/출력하도록 만들어보자.
-내가 작성한 코드
package io.ch04; import java.io.BufferedReader; import java.io.InputStreamReader; public class MyBufferedReadConsoleIO2 { public static void main(String[] args) { // 문자 기반 스트림 + 보조 문자 기반 스트림 boolean flag=true; // 옆으로 확장되는 데코레이터 패턴 try (InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr);){ while(flag) { System.out.println("더 많은 텍스트를 입력하세요.(한 줄 단위=엔터)"); String inputUserData = br.readLine(); if(inputUserData.equals("")) { System.out.println("프로그램이 종료됩니다."); flag=false; return; } System.out.println("입력 확인 : "+inputUserData); } } catch (Exception e) { // TODO: handle exception } } }
-선생님이 작성하신 코드
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)) { // while() {} String line; // "" --> 엔터 ---> ine.isEmpty() -- ! --> F --> 실행에 종료가 된다. 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(); } } }
728x90반응형'Java > 자바 Stream' 카테고리의 다른 글
[Java] 86. 파일 출력 스트림 (2) (문자 기반 스트림) (0) 2024.05.20 [Java] 85. 파일 입력 스트림(1) (문자 기반 스트림) (0) 2024.05.20 [Java] 83. 파일 Copy 예제: 기반 스트림에 확장을 붙여 더욱 빠르게 연산시켜보자. (0) 2024.05.17 [Java] 82. 파일 Copy(바이트 기반 입/출력) (0) 2024.05.16 [Java] 81. 파일 출력 스트림 (바이트) (0) 2024.05.16 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)