Everything has an expiration date
172 - Java 자바의 기본 입출력(I/O) : 문자 스트림 입출력, 바이트 스트림 입출력. write() read() 메소드 명은 동일하지만, 매개변수가 무엇이냐에 따라 문자 스트림, 바이트 스트림 달라진다. 본문
[Java]/Java Concepts
172 - Java 자바의 기본 입출력(I/O) : 문자 스트림 입출력, 바이트 스트림 입출력. write() read() 메소드 명은 동일하지만, 매개변수가 무엇이냐에 따라 문자 스트림, 바이트 스트림 달라진다.
Jelly-fish 2023. 9. 25. 15:01/* ========================================
■■■ 자바의 기본 입출력(I/O) ■■■
==========================================*/
/*
자바는 단일 입출력이다 물 줄기처럼 한 방향으로 흐른다.(단방향)
아래의 그림처럼 먼저 들어왔던 것이 먼저 나간다. → First input First Output
in→ -----------
-- |
| |
| --- →
| --- out
---------
스트림 위에 무언가를 띄워서 보낸다...
바깥으로 무언가를 내보내지 못하면(데이터) 안 된다.
먼저 띄워보낸 종이배(데이터)가 나가야만 (blocking)
그 다음에 띄워보낸 종이배가 나갈 수 있다.
문자 input output
바이트 input output
총 4가지 종류.
--------------------------------------------------------------------------------
○ 자바의 기본 입출력 개요
- 자바에서의 모든 데이터의 입출력은 『스트림(Stream)』이라는 개념에 의해
이루어지는데, 『스트림(Stream)』 이라는 단어의 사전적 의미는
"흐르는 물"의 개념이며, 이는 연속된 일련의 데이터를 일컫는다.
- 데이터 입출력 시 모든 데이터를 형태와 관계없이 일련의 흐름으로
전송을 하는 것이 스트림 입출력 모델의 기본 개념이다.
- 기본적으로 스트림(Stream)에는
바이트 기반 스트림과 문자 기반 스트림이 있다.
---------------------------------------------------------------------------------
○ 바이트 스트림(byte-stream) 입출력
- InputStream 클래스와 OutputStream 클래스, 그리고 이들의 하위 클래스를
통해서 제공되는 바이트 스트림(byte-stream)을 위한 표준 입출력으로
8비트 크기를 갖는 바이트들의 스트림이 입출력된다.
(바이트, 바이트배열, 정수 등)
○ 문자 스트림(character-stream) 입출력
- Reader 클래스와 Writer 클래스, 그리고 이들의 하위 클래스에 의해
구현되었으며, 8비트 크기를 갖는 바이트들의 스트림이 아닌
16비트 크기를 갖는 유니코드 문자들의 스트림이라는 점에서 차이가 있다.
(문자, 문자배열, 문자열 등)
----------------------------------------------------------------------------------
※ 스트림(stream)의 특징
----------------------------------------------------------------------------------
- 스트림은 FIFO 구조이다.
FIFO 구조란, 먼저 들어간 것이 먼저 나오는 형태로
스트림의 데이터는 순차적으로 흘러가며 순차적 접근 밖에는 허용되지 않는다.
-----------------------------------------------------------------------------------
- 스트림은 단방향이다.
자바에서 스트림은 읽기 쓰기가 동시에 이루어지지 않는다.
따라서 읽기 쓰기가 필요하다면 읽는 스트림과 쓰는 스트림을
하나씩 열어서 사용해야 한다.
-----------------------------------------------------------------------------------
- 스트림은 지연될 수 있다.
스트림에 넣어진 데이터는 처리되기 전에는 스트림에 사용하는 스레드는
지연(blocking) 상태에 빠진다.
네트워크 상에서는 데이터가 모두 전송되기 전까지 스레드는 지연(blocking)
상태가 된다.
-----------------------------------------------------------------------------------
★ 바이트 스트림 입출력 - InputStream, OutputStream 클래스 하위 클래스
★ 문자 스트림 입출력 - Reader, Writer 클래스 하위 클래스
*/
// Test174.java 파일과 비교
import java.io.IOException;
public class Test172
{
public static void main(String[] args) throws IOException
{
int data;
char ch;
// 바이트 기반 입력 받고
System.out.println("문자열 입력(종료:Ctrl+z)" );
// 한 개의 문자를 읽어오는 System.in.read() → int 타입으로 읽어들임.
// 문자 하나만 가지고 오는 것이다.
// 그것을 데이터에 넣고(ASCII Code) -1 이 아니면 (입력되어 있는 값이 null 이면 -1)
// 입력된 내용만큼 반복문을 돌도록 구성하는 것.
// read() : InputStream 클래스의 대표적 메소드(→ 바이트 스트림)
while ((data = System.in.read()) != -1)
{
ch = (char)data;
// 16비트 크기를 갖는 유니코드 문자들의 스트림 → 문자 스트림
// 문자 하나만 읽어오는 문자 스트림을 사용했을 때는
// 한글을 입력했을 때 전부 깨져서 출력되는 것을 확인할 수 있다.
// 문자 기반 출력을 하므로 한글이 깨짐.
//System.out.print(ch); // (→ 문자 스트림)
//--==>> 문자열 입력(종료:Ctrl+z)
// abcd
// abcd
// ABCD
// ABCD
// 1234
// 1234
// 가나다라
// °¡³ª´?¶?
// ^Z
// 계속하려면 아무 키나 누르십시오 . . .
// write() : OutputStream 클래스의 대표적 메소드(→ 바이트 스트림)
// 8비트 크기를 갖는 바이트들의 스트림이 입출력 → 바이트 스트림
System.out.write(ch);
//--==>> 문자열 입력(종료:Ctrl+z)
// abcd
// abcd
// ABCD
// ABCD
// 1234
// 1234
// 가나다라
// 가나다라
// ^Z
// 계속하려면 아무 키나 누르십시오 . . .
}
}
}