✔ 스트림(Stream)
- 자바에서 데이터는 스트림을 통해 입출력 된다
- 프로그램이 데이터의 출발지인지 도착지인지의 여부에 따라 사용하는 스트림의 종류가 결정된다 
✔ 입출력 스트림의 종류
- 바이트 기반 스트림 : 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력한다
- 문자 기반 스트림 : 문자 데이터를 읽고 출력할 때 사용한다
- 최상위 클래스로 스트림 클래스의 바이트/문자 기반 판단한다 
🎈 바이트 출력 스트림 : OutputStream
💡 Write(int b) 메소드
: 매개 변수로 주어지는 int(4byte)에서 끝 1byte만 출력 스트림으로 보낸다 
- 코드
package jse_20210308_1; import java.io.FileOutputStream; import java.io.OutputStream; public class WriteExSelfStudy { public static void main(String[] args) throws Exception{ // 1 byte씩 출력하기 // ("C:/Temp/Test1.db") : 데이터 도착지를 test1.db로 하는 바이트 기반 파일 출력 스트림 생성 OutputStream os = new FileOutputStream("C:/Temp/Test1.db"); // 변수 생성 byte a = 10; byte b = 20; byte c = 30; // 1byte씩 출력 os.write(a); os.write(b); os.write(c); os.flush(); // 출력 버퍼에 잔류하는 모든 바이트를 출력 os.close(); // 출력 스트림 닫음 } }
▶ 실행결과
💡 Write(byte[] b) 메소드
: 매개값으로 주어진 배열의 모든 바이트를 출력 스트림으로 보낸다 
- 코드 1
package jse_20210308_1; import java.io.FileOutputStream; import java.io.OutputStream; public class WriteExSelfStudy2 { public static void main(String[] args) throws Exception{ // 배열 전체 출력하기 // ("C:/Temp/Test2.db") : 데이터 도착지를 test2.db로 하는 바이트 기반 파일 출력 스트림 생성 OutputStream os = new FileOutputStream("C:/Temp/Test2.db"); // 배열생성 byte[] array = {10,20,30}; // 배열의 모든 바이트를 출력 os.write(array); os.flush(); // 출력 버퍼에 잔류하는 모든 바이트를 출력 os.close(); // 출력 스트림을 닫는다 } }
▶ 실행결과
- 코드 2
package jse_20210308_1; import java.io.FileOutputStream; import java.io.OutputStream; public class WriteExSelfStudy3 { public static void main(String[] args) throws Exception{ // 배열 일부 출력하기 // ("C:/Temp/Test3.db") : 데이터 도착지를 test3.db로 하는 바이트 기반 파일 출력 스트림 생성 OutputStream os = new FileOutputStream("C:/Temp/Test3.db"); // 배열생성 byte[] array = {10,20,30,40,50}; // 배열의 1번 인덱스부터 3개를 출력 => 3은 출력에 포함 X os.write(array,1,3); os.flush(); // 출력 버퍼에 잔류하는 모든 바이트를 출력 os.close(); // 출력 스트림을 닫는다 } }
▶ 실행결과
❗ 설명
🎈 바이트 입력 스트림 : InputStream
💡 read() 메소드
- 입력 스트림으로부터 1byte 읽고 int(4byte) 타입으로 리턴 한다
- 리턴된 4byte 중 끝 1byte에만 데이터 들어 있다
- 더 이상 입력 스트림으로부터 바이트 읽을 수 없게 되면 -1 리턴한다
* 읽을 수 있는 마지막 바이트까지 반복하여 1byte씩 읽을 수 있다 
- 코드
package jse_20210308_1; import java.io.FileInputStream; import java.io.InputStream; public class ReadStreamSelfStudy { public static void main(String[] args) throws Exception{ // 1byte씩 읽기 // ("C:/Temp/Test1.db") : 데이터 출발지를 test1.db로 하는 바이트 기반 파일 입력 스트림을 생성한다 // C:/Temp/Test1.db => OutputStrem 에서 작성된 것 InputStream is = new FileInputStream("C:/Temp/Test1.db"); while(true) { // data가 is.read() 일경우 반복 int data = is.read(); // 1byte씩 읽기 // data가 -1일 경우 브레이크 if(data == -1) { break; // 파일 끝에 도달했을 경우 } System.out.println(data); } is.close(); // 입력스트림을 닫는다 } }
▶ 실행결과
💡 read(byte[] b) 메소드
- 입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트 읽고 해당 배열에 저장,
그리고 읽은 바이트 수를 리턴한다 
- 코드
package jse_20210308_1; import java.io.FileInputStream; import java.io.InputStream; public class ReadStreamSelfStudy2 { public static void main(String[] args) throws Exception{ // 배열 길이만큼 읽기 // ("C:/Temp/Test2.db") : 데이터 출발지를 test2.db로 하는 바이트 기반 파일 입력 스트림을 생성한다 // C:/Temp/Test2.db => OutputStrem 에서 작성된 것 InputStream is = new FileInputStream("C:/Temp/Test2.db"); // 길이 100인 배열 생성한다 byte[] buffer = new byte[100]; while(true) { int readByteNum = is.read(buffer); // 배열 길이만큼 읽기 // 파일 끝에 도달했을경우 브레이크 if(readByteNum == -1) { break; } // 읽은 바이트 수만큼 반복하면서 배열에 저장된 바이트를 출력 for(int i=0;i<readByteNum; i++) { System.out.println(buffer[i]); } is.close(); // 입력 스트림을 닫음 } } }
▶ 실행결과
💡 read(byte[] b, int offm int len) 메소드
- 입력 스트림으로부터 len 개의 바이트 만큼 읽고 매개값으로 주어진 바이트 배열 b[off] 부터
len개 까지 저장, 그리고 읽은 바이트 수인 len개 리턴 
- 코드
package jse_20210308_1; import java.io.FileInputStream; import java.io.InputStream; public class ReadStreamSelfStudy3 { public static void main(String[] args) throws Exception{ // 지정한 길이만큼 읽기 // ("C:/Temp/Test3.db") : 데이터 출발지를 test3.db로 하는 바이트 기반 파일 입력 스트림을 생성한다 // C:/Temp/Test3.db => OutputStrem 에서 작성된 것 InputStream is = new FileInputStream("C:/Temp/Test3.db"); // 5길이의 배열 생성 byte[] buffer = new byte[5]; // 입력 스트림으로부터 3byte를 읽고 buffer[2],buffer[3],buffer[4]에 각각 저장한다 int readByteNum = is.read(buffer, 2, 3); // 읽은 바이트가 있다면 if(readByteNum != -1) { // 배열 전체를 읽고 출력 for(int i=0; i<buffer.length; i++) { System.out.println(buffer[i]); } } is.close(); // 입력 스트림을 닫는다 } }
▶ 실행결과
🎈 문자 출력 스트림 : Writer
- 문자 기반 출력 스트림의 최상위 클래스
- 모든 문자 기반 출력 스트림 클래스는 Writer 클래스를 상속받아 만들어진다 
💡 Writer(int c) 메소드
- 매개 변수로 주어지는 int(4byte) 에서 끝 2byte(1개 문자) 만 출력 스트림을 보낸다 
- 코드
package jse_20210308_1; import java.io.FileWriter; import java.io.Writer; public class WriteStudySelf { public static void main(String[] args) throws Exception { // 한 문자씩 출력하기 // ("C:/Temp/Test7.txt") : 데이터 도착지를 Test7.txt로 하는 문자 기반 파일 출력 스트림 생성 Writer writer = new FileWriter("C:/Temp/Test7.txt"); // 문자형 변수 생성 char a = 'A'; char b = 'B'; char c = 'C'; // 한 문자씩 출력 writer.write(a); writer.write(b); writer.write(c); writer.flush(); // 출력 버퍼에 잔류하는 모든 문자 출력 writer.close(); // 출력 스트림을 닫는다 } }
▶ 실행결과
💡 Writer(char[] cbuf) 메소드
- 매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다 
- 코드
package jse_20210308_1; import java.io.FileWriter; import java.io.Writer; public class WriteStudySelf2 { public static void main(String[] args) throws Exception { // 배열 전체를 출력하기 // ("C:/Temp/Test8.txt") : 데이터 도착지를 Test8.txt로 하는 문자 기반 파일 출력 스트림 생성 Writer writer = new FileWriter("C:/Temp/Test8.txt"); // 문자형 배열 생성 char[] array = {'A','B','C'}; writer.write(array); // 배열의 모든 문자를 출력 writer.flush(); // 출력 버퍼에 잔류하는 모든 문자를 출력 writer.close(); // 출력 스트림을 닫음 } }
▶ 실행결과
💡 Writer(char[] cbuf,int off, int len) 메소드
- c[off]부터 len개의 문자를 출력 스트림으로 보낸다 
- 코드
package jse_20210308_1; import java.io.FileWriter; import java.io.Writer; public class WriteStudySelf3 { public static void main(String[] args) throws Exception { // 배열 일부를 출력하기 // ("C:/Temp/Test9.txt") : 데이터 도착지를 Test9.txt로 하는 문자 기반 파일 출력 스트림 생성 Writer writer = new FileWriter("C:/Temp/Test9.txt"); // 문자형 배열 생성 char[] array = {'A','B','C','D','E'}; writer.write(array,1,3); // 배열의 1번 인덱스부터 3개를 출력 writer.flush(); // 출력 버퍼에 잔류하는 모든 문자를 출력 writer.close(); // 출력 스트림을 닫음 } }
▶ 실행결과
💡 write(String str) 와 writer(String str, int off, int len) 메소드
- write(String str)은 문자열 전체를 출력 스트림으로 보낸다
- write(String str, int off, int len)은 주어진 문자열 off순번부터 len개까지의 문자를 보낸다 
- 코드
package jse_20210308_1; import java.io.FileWriter; import java.io.Writer; public class WriteStudySelf4 { public static void main(String[] args) throws Exception { // 문자열 출력하기 // ("C:/Temp/Test10.txt") : 데이터 도착지를 Test10.txt로 하는 문자 기반 파일 출력 스트림 생성 Writer writer = new FileWriter("C:/Temp/Test10.txt"); // 문자열 생성 String str = "ABC"; writer.write(str); // 문자열 전체를 출력 writer.flush(); // 출력 버퍼에 잔류하는 모든 문자열을 출력 writer.close(); // 출력 스트림을 닫는다 } }
▶ 실행결과
🎈 문자 입력 스트림 : Reader
- 문자 기반 입력 스트림의 최상위 클래스
- 모든 문자 기반 입력 스트림은 Reader 클래스 상속받아 만들어진다 
💡 read() 메소드
- 입력 스트림으로부터 1개의 문자(2byte) 읽고 int(4byte)타입으로 리턴
- 리턴된 4byte 중 끝 2byte에 문자 데이터 들고 있다
- read() 메소드가 리턴한 int값 ch 
- 코드
package jse_20210308_1; import java.io.FileReader; import java.io.Reader; public class ReaderSelfStudy { public static void main(String[] args) throws Exception { // ("C:/Temp/Test7.txt") : 데이터 도착지를 Test7.txt로 하는 문자 기반 파일 출력 스트림 생성 Reader reader = new FileReader("C:/Temp/Test7.txt"); while(true) { int data = reader.read(); // 한 문자씩 읽기 if(data == -1) { // 파일 끝에 도달했을 경우 break; } System.out.println((char)data); } reader.close(); // 입력 스트림 닫는다 } }
▶ 실행결과
💡 read(char[] cbuf) 메소드
- 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자 읽고 배열에 저장,
그리고 읽은 문자 수를 리턴한다 
- 코드
package jse_20210308_1; import java.io.FileReader; import java.io.Reader; public class ReaderSelfStudy2 { public static void main(String[] args) throws Exception { // ("C:/Temp/Test8.txt") : 데이터 도착지를 Test8.txt로 하는 문자 기반 파일 출력 스트림 생성 Reader reader = new FileReader("C:/Temp/Test8.txt"); // 길이 100인 배열 생성 char[] buffer = new char[100]; while(true) { int readCharNum = reader.read(buffer); // 배열 길이만큼 읽기 if(readCharNum == -1) { // 파일 끝에 도달했을 경우 break; } // 읽은 문자 수만큼 반복하면서 배열에 저장된 문자를 출력 for(int i=0; i<readCharNum; i++) { System.out.println(buffer[i]); } reader.close(); // 입력 스트림 닫는다 } } }
▶ 실행결과
💡 read(char[] cbuf, intoff, intlen) 메소드
- 입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열에서
cbuf[off] 부터 len개까지 저장, 그리고 읽은 문자 수인 len개 리턴 
- 코드
package jse_20210308_1; import java.io.FileReader; import java.io.Reader; public class ReaderSelfStudy3 { public static void main(String[] args) throws Exception { // ("C:/Temp/Test9.txt") : 데이터 도착지를 Test9.txt로 하는 문자 기반 파일 출력 스트림 생성 Reader reader = new FileReader("C:/Temp/Test9.txt"); // 길이 5인 배열 생성 char[] buffer = new char[5]; // 입력스트림으로부터 3개의 문자를 읽고 buffer[2],buffer[3],buffer[4]에 각각 저장한다 int readCharNum = reader.read(buffer, 2,3); if(readCharNum != -1) { // 읽은 문자가 있다면 // 배열 전체를 읽고 출력 for(int i =0; i<buffer.length; i++) { System.out.println(buffer[i]); } } reader.close(); // 입력 스트림을 닫음 } }
▶실행결과
✔ 보조 스트림
- 다른 스트림과 연결되어 여러가지 편리한 기능을 제공하는 스트림
- 자체적으로 입출력 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer 등에 연결하여 입출력 수행 