• Home
  • About
    • ming photo

      ming

      studying

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Archive
    • All Posts
    • All Tags
    • All categories
  • categories
    • HTML+CSS+JavaScript
    • JAVA
    • Algorithm
    • DB
    • JSP
    • 정보처리기사
    • Spring
    • Thymeleaf
    • 기술면접
  • Projects

JAVA-스트림(Stream), 보조 스트림

08 Mar 2021

✔ 스트림(Stream)

- 자바에서 데이터는 스트림을 통해 입출력 된다
- 프로그램이 데이터의 출발지인지 도착지인지의 여부에 따라 사용하는 스트림의 종류가 결정된다 ![Stream](https://user-images.githubusercontent.com/65608960/110261352-42d57d00-7ff3-11eb-87bc-c84911c77d1d.JPG)

✔ 입출력 스트림의 종류

- 바이트 기반 스트림 : 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력한다
- 문자 기반 스트림 : 문자 데이터를 읽고 출력할 때 사용한다
- 최상위 클래스로 스트림 클래스의 바이트/문자 기반 판단한다 ![Stream 종류](https://user-images.githubusercontent.com/65608960/110261424-84662800-7ff3-11eb-94bc-2eb1b0db2f1a.JPG)

🎈 바이트 출력 스트림 : OutputStream

outputStream

💡 Write(int b) 메소드
  : 매개 변수로 주어지는 int(4byte)에서 끝 1byte만 출력 스트림으로 보낸다 ![write](https://user-images.githubusercontent.com/65608960/110289591-fd35a600-802c-11eb-9a18-d5457950fdfb.JPG)
  • 코드
      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실행결과

💡 Write(byte[] b) 메소드
  : 매개값으로 주어진 배열의 모든 바이트를 출력 스트림으로 보낸다 ![write2](https://user-images.githubusercontent.com/65608960/110290589-489c8400-802e-11eb-8ce2-cc91c30f80f5.JPG)
  • 코드 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(); // 출력 스트림을 닫는다
          }
      }
    

    ▶ 실행결과 write2실행결과

  • 코드 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(); // 출력 스트림을 닫는다
          }
      }
    

    ▶ 실행결과 write3실행결과

❗ 설명 write3설명

🎈 바이트 입력 스트림 : InputStream

input

💡 read() 메소드
- 입력 스트림으로부터 1byte 읽고 int(4byte) 타입으로 리턴 한다
- 리턴된 4byte 중 끝 1byte에만 데이터 들어 있다
- 더 이상 입력 스트림으로부터 바이트 읽을 수 없게 되면 -1 리턴한다
    * 읽을 수 있는 마지막 바이트까지 반복하여 1byte씩 읽을 수 있다 ![read](https://user-images.githubusercontent.com/65608960/110293739-489e8300-8032-11eb-820f-8cb565ef2d10.JPG)
  • 코드
      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출력화면

💡 read(byte[] b) 메소드
- 입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트 읽고 해당 배열에 저장,
  그리고 읽은 바이트 수를 리턴한다 ![read2](https://user-images.githubusercontent.com/65608960/110295993-235f4400-8035-11eb-866b-4602120329b3.JPG)
  • 코드
      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(); // 입력 스트림을 닫음
              }
          }
      }
    

▶ 실행결과 read2출력화면

💡 read(byte[] b, int offm int len) 메소드
- 입력 스트림으로부터 len 개의 바이트 만큼 읽고 매개값으로 주어진 바이트 배열 b[off] 부터
  len개 까지 저장, 그리고 읽은 바이트 수인 len개 리턴 ![read3](https://user-images.githubusercontent.com/65608960/110296852-2444a580-8036-11eb-8d27-3d8f2608c3bc.JPG)
  • 코드
      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(); // 입력 스트림을 닫는다
          }
      }
    

▶ 실행결과 read3출력화면

🎈 문자 출력 스트림 : Writer

- 문자 기반 출력 스트림의 최상위 클래스
- 모든 문자 기반 출력 스트림 클래스는 Writer 클래스를 상속받아 만들어진다 ![Writer](https://user-images.githubusercontent.com/65608960/110298537-0bd58a80-8038-11eb-9a74-efb060117615.JPG)
💡 Writer(int c) 메소드
- 매개 변수로 주어지는 int(4byte) 에서 끝 2byte(1개 문자) 만 출력 스트림을 보낸다 ![Writer1](https://user-images.githubusercontent.com/65608960/110298533-0aa45d80-8038-11eb-8fb1-64cfe7fbfb62.JPG)
  • 코드
      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(); // 출력 스트림을 닫는다
    
          }
    
      }
    

    ▶ 실행결과 Writer1출력화면

💡 Writer(char[] cbuf) 메소드
- 매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다 ![Writer2](https://user-images.githubusercontent.com/65608960/110299327-ded5a780-8038-11eb-8210-b337bc3f2752.JPG)
  • 코드
      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(); // 출력 스트림을 닫음
          }
      }
    

    ▶ 실행결과 Writer2출력화면

💡 Writer(char[] cbuf,int off, int len) 메소드
- c[off]부터 len개의 문자를 출력 스트림으로 보낸다 ![Writer3](https://user-images.githubusercontent.com/65608960/110299754-6a4f3880-8039-11eb-98b6-01dab5c3eed1.JPG)
  • 코드
      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(); // 출력 스트림을 닫음
          }
      }
    

    ▶ 실행결과 Writer3출력화면

💡 write(String str) 와 writer(String str, int off, int len) 메소드
- write(String str)은 문자열 전체를 출력 스트림으로 보낸다
- write(String str, int off, int len)은 주어진 문자열 off순번부터 len개까지의 문자를 보낸다 ![Writer4](https://user-images.githubusercontent.com/65608960/110300217-f8c3ba00-8039-11eb-86d9-e3454f822b6f.JPG)
  • 코드
      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(); // 출력 스트림을 닫는다		
          }
      }
    

    ▶ 실행결과 Writer5

🎈 문자 입력 스트림 : Reader

- 문자 기반 입력 스트림의 최상위 클래스
- 모든 문자 기반 입력 스트림은 Reader 클래스 상속받아 만들어진다 ![Reader](https://user-images.githubusercontent.com/65608960/110300693-84d5e180-803a-11eb-9810-0530dd227738.JPG)
💡 read() 메소드
- 입력 스트림으로부터 1개의 문자(2byte) 읽고 int(4byte)타입으로 리턴
- 리턴된 4byte 중 끝 2byte에 문자 데이터 들고 있다
- read() 메소드가 리턴한 int값 ch ![read-1](https://user-images.githubusercontent.com/65608960/110300845-c1a1d880-803a-11eb-8b2b-e0ff8a34ccbd.JPG)
  • 코드
      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-1출력화면

💡 read(char[] cbuf) 메소드
- 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자 읽고 배열에 저장,
  그리고 읽은 문자 수를 리턴한다 ![read-2](https://user-images.githubusercontent.com/65608960/110301535-8653d980-803b-11eb-8c04-2e21255a4860.JPG)
  • 코드
      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-2출력화면

💡 read(char[] cbuf, intoff, intlen) 메소드
- 입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열에서 
   cbuf[off] 부터 len개까지 저장, 그리고 읽은 문자 수인 len개 리턴 ![read-3](https://user-images.githubusercontent.com/65608960/110302176-49d4ad80-803c-11eb-8aad-779502554dca.JPG)
  • 코드
          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(); // 입력 스트림을 닫음
              }
          }
    

▶실행결과 read-3출력화면

✔ 보조 스트림

- 다른 스트림과 연결되어 여러가지 편리한 기능을 제공하는 스트림
- 자체적으로 입출력 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 InputStream, OutputStream, Reader, Writer 등에 연결하여 입출력 수행 ![보조스트림](https://user-images.githubusercontent.com/65608960/110267950-2857cf80-8004-11eb-9dec-fd113ae7e5b5.JPG)


Share Tweet +1