Test160~Test168
Test168~Test173
바이트기반 스트림 / 문자기반스트림 으로 나뉨
수제비처럼 하나씩하나씩 떼서 넣고 하나씩하나씩 나오고
임시적으로 물을 저장해놓을 수 있는 버퍼가 달려있는 스트림이있음(주사기처럼 차면 밀어놓고)
버퍼되어있는 물줄기 / 버퍼되어있지 않은 물줄기
이것도 바이트기반 스트림 / 문자기반스트림 으로 나뉨
이제 그럼 알아할 것은!!
수도꼭지 트는 방법
수도꼭지 잠그는 방법
하나하나떠서 그스트림에 올리는 방법
스트림에 있는걸 끄집어 내는 방법
바이트기반 스트림할떼 주의할점
문자기반 스트림할떼 주의할점
이거 보면 끝
자바에서의 모든 데이터 입출력은 『스트림(stream)』이라는 개념에 의해
이루어 지는데, 『스트림(stream)』이라는 단어의 사전적 의미는
"흐르는 물"의 개념이며, 이는 연속된 일련의 데이터를 일컫는다.
데이터 입출력 시 모든 데이터를 형태와 관계없이 일련된 흐름으로
전송을 하는 것이 스트림 입출력 모델의 기본 개념이다.
기본적으로 『스트림(stream)』에는
바이트 기반의 스트림과, 문자 기반의 스트림이 있다.
※ 스트림의 특징
- 스트림은 FIFO 구조이다.
FIFO 구조란, 먼저 들어간 것이 먼저 나오는 형태로
스트림의 데이터는 순차적으로 흘러가며 순차적 접근 밖에는 허용되지 않는다.
- 스트림은 단방향이다.
자바에서 스트림은 읽기 쓰기가 동시에 이루어지지 않는다.
따라서 읽기 쓰기가 필요하다면 읽는 스트림과 쓰는 스트림을
하나씩 열어서 사용해야 한다.
- 스트림은 지연될 수 있다.
스트림에 넣어진 데이터는 처리되기 전에는 스트림에 사용하는 스레드는
지연(blocking) 상태에 빠진다.
네트워크 상에서는 데이터가 모두 전송되기 전까지 스레드는 지연(blocking)
상태가 된다.
// Test170.java 파일과 비교~!!!
import java.io.IOException;
public class Test168
{
public static void main(String[] args) throws IOException
{
int data;
char ch;
System.out.println("문자열 입력(종료:Ctrl+z)");
// read() : InputStream 클래스의 대표적 메소드(→ 바이트 스트림)
while ((data = System.in.read()) != -1) //null 이 아니라면 //-- System.in.read때문에 IOException
{
ch = (char)data;
System.out.print(ch);
/*
문자열 입력(종료:Ctrl+z)
abcd
abcd
1234
1234
가나다라
°¡³ª´?¶?
^Z
계속하려면 아무 키나 누르십시오 . . .
*/
//write() : OutputStream 클래스의 대표적 메소드(→ 바이트 스트림)
System.out.write(ch);
/*
문자열 입력(종료:Ctrl+z)
abcd
abcd
1234
1234
가나다라
가나다라
^Z
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
}
import java.io.OutputStream;
import java.io.IOException;
public class Test169
{
//public static void main(String[] args) throws IOException; -> error: missing method body, or declare abstract 발생함!
public static void main(String[] args) throws IOException
{
// System.in : 자바의 표준 입력 스트림(바이트 기반)
// System.out : 자바의 표준 출력 스트림
OutputStream out = System.out;
byte[] ch = new byte[3];
ch[0] = 65; // A
ch[1] = 97; // a
ch[2] = 122; // z
out.write(ch); //-- 밖으로 내보낼 데이터(변수)를 스트림에 기록
out.flush(); //-- 기록된 스트림을 내보내는(밀어내는) 기능을 수행
// 지금은 Buffer 를 활용하지 않고 있는 상황이기 때문에
// 생략이 가능한 코드
// (Buffered 되어 있는 스트림(stream)일 경우 생략 불가)
out.close(); //-- 출력 스트림(물줄기)에 대한 리소스 반납
// (out 스트림(수도꼭지를 잠가버린 상황)
System.out.println("절대적인 신뢰를 갖고 있는 구문..."); //밖으로 나가는 물줄기를 잠궈버려서 출력안됨!! out.close()
//-- 『out.close()』를 작성한 이후 출력되지 않는 구문
// 출력되는 스트림(물줄기)을 닫았기 때문에...
}
}
// Reader 실습
// Test168.java 파일과 비교~!!!
import java.io.Reader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test170
{
public static void main(String[] args) throws IOException
{
int data;
char ch;
//System.in : 자바 표준 입력 스트림 -> 바이트 기반 스트림
//InputStreamReader : 바이트 기반 스트림을 -> 문자 기반 스트림으로
// 변환해주는 역할 수행
//Reader : 문자 기반 스트림 객체
Reader rd = new InputStreamReader(System.in);
// ----- 문자 --------번역----- --------바이트
System.out.println("문자열 입력(종료:Ctrl+z)");
while ((data = rd.read()) != -1)
{
ch = (char)data;
//System.out.write(ch);
/*
문자열 입력(종료:Ctrl+z)
abcd
abcd
1234
1234
가나다라
섆|
^Z
계속하려면 아무 키나 누르십시오 . . .
*/
System.out.print(ch);
/*
문자열 입력(종료:Ctrl+z)
abcd
abcd
1234
1234
가나다라
가나다라
^Z
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
}
public class Test171
{
public static void main(String[] args)
{
//System.out : 자바 기본 출력 스트림 -> 여기엔 기본적으로 버퍼가 포함되어있음
System.out.write(65); //--'A'
System.out.write(66); //--'B'
System.out.write(180);
System.out.write(235); //-- 180 + 235 = '대'
System.out.flush();
//-- 현재 구문에서는 생략 불가~!!!
// 출력 버퍼가 채워지지 않으면
// 출력할 데이터(자료)를 출력 디바이스(장치)로 보내지 않기 때문에
// flush() 메소드를 통해 아직 다 채워지지 않은
// 출력 버퍼의 내용을 출력장치로 밀어내어 보낼 수 있도록 처리해야 한다.
}
}
// Reader Writer 실습
import java.io.InputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class Test172
{
public void process(InputStream is) //InputStream 바이트기반의 입력 스트림
{
int data;
System.out.println("문자열 입력(종료 : Ctrl+z)");
try
{
//매개변수 is 라는 바이트기반 객체(InputStream)fmf
//문자 스트림으로 변환하여
//(-> InputStreamReader 가 수행)
//Reader 타입의 rd 에서 참조할 수 있도록 처리
Reader rd = new InputStreamReader(is); //is 는 System.in으로 넘겨준 InputStream 을 번역해서(인풋 스트림리더) 문자열로
//바이트 기반 스트림인 자바 기본 출력 스트림(System.out)을
//문자 스트림으로 변환하여
//(-> OutputStreamWriter 가 수행)
//Writer 타입의 wt 에서 참조할 수 있도록 처리
Writer wt = new OutputStreamWriter(System.out); //아웃풋스트림롸이터 바이트기반을 문자기반으로 바꿔주는 것
while ( (data = rd.read()) != -1)
{
wt.write(data); //-- 스트림 물줄기에 기록 //출력스트림을 쓰겠다 문자열기반
wt.flush(); //-- 기록한 스트림을 밀어내어 내보냄 //출력스트림을 밀어내겠다 문자열기반
}
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
public static void main(String[] args)
{
Test172 ob = new Test172();
ob.process(System.in); //System.in 바이트기반의 입력 스트림
}
}
/*
문자열 입력(종료 : Ctrl+z)
abcd
abcd
1234
1234
가나다라
가나다라
^Z
계속하려면 아무 키나 누르십시오 . . .
*/