입출력 스트림

hwakyoung·2023년 2월 18일
0

java

목록 보기
6/7
post-thumbnail

📌입출력 스트림

🍀자바에서 데이터는 스트림Stream을 통해 입출력 된다.
🍀 스트림단일 방향 으로 연속적으로 흘러가는 것을 이야기 한다.

🍀프로그램이 도착지냐 출발지냐에 따라 사용하는 스트림의 종류가 결정된다.


📌입출력 스트림의 종류

🍀java.io 패키지에는 여러 가지 종류의 스트림(Stream) 클래스 를 제공한다.

  • 바이트(byte) 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
  • 문자(character) 기반 스트림: 문자 데이터를 읽고 출력할 때 사용


📌바이트 출력 스트림(OutPutStream)

🍀 OutPutStream은 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.

🍀모든 바이트 기반 출력 스트림 클래스는 OutPutStream 클래스를 상속받아서 만들어 진다.

📌OutPutStream 클래스의 주요 메소드

🍀리턴 타입🍀메소드🍀설명
voidwrite(int b)1byte를 출력합니다.
voidwrite(byte[ ] b)매개값으로 주어진 배열 b의 모든 바이트를 출력합니다.
voidwrite(byte[] b, int off, int len)매가값으로 주어진 배열 b[off]부터 len개까지의 바이트를 출력합니다.
voidflush()출력 버퍼에 잔류하는 모든 바이트를 출력합니다.
voidclose()출력 스트림을 닫습니다.

📌write(int b) 메소드

🍀 write(int b)메소드는 매개 변수로 주어지는 int(4byte) 에서 끝 1byte만 출력 스트림으로 보내진다.

🍀But 모두 4byte로 모두 보내지는 것은 아니다.

📍1byte씩 출력하기

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteExample {
	public static void main(String args[]) throw Exception {
    	OutputStream os = new FileOutput("C:/Temp/test1.db");	
        //데이터 도착지를 test1.db로 하는 바이트 기반 파일 출력 스트림을 생성
        
        byte a = 10;
        byte b = 20;
        byte c = 30;
        
        os.write(a);		// 1byte씩 출력
        os.write(b);
        os.write(c);
        
        os.flush();		// 출력 버퍼에 잔류하는 모든 바이트를 출력
        os.close();		// 출력 스트림을 닫음 
    
    }
}

📍출력결과는 파일 탐색기에서 확인가능


📌write(byte[] b) 메소드

🍀write(byte[] b) 메소드는 매개값으로 주어진 배열의 모든 바이트를 추력 스트림으로 보내진다.

📍배열 전체를 출력하기

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteExample {
	public static void main(String args[]) throw Exception {
    	OutputStream os = new FileOutput("C:/Temp/test2.db");
        
        byte[] array = {10,20,30};
        
        os.write(array);
        
        os.flush();
        os.close();
    }
}

📍출력결과는 파일 탐색기에서 확인가능


📌write(byte[]b, int off, int len) 메소드

🍀write(byte[]b, int off, int len) 메소드는 b[off]부터 len개의 바이트를 출력 스트림으로 보낸다.

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteExample {
	public static void main(String args[]) throw Exception {
    	OutputStream os = new FileOutput("C:/Temp/test3.db");
        
                byte[] array = {10,20,30,40,50};
        
        os.write(array, 1, 3);		//배열의 1번 인덱스 부터 3개를 출력
        
        os.flush();		//출력 버퍼에 잔류하는 모든 바이트를 출력
        os.close();		//출ㄺ 스트림을 닫음 
    }
}
        

📍출력결과는 파일 탐색기에서 확인가능


📌바이트 입력 스트림:InPutStream

🍀InputStream은 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.

🍀모든 바이트 기반 입력 스트림은 InputStream 클래스를 상속받아서 만들어진다


📍InputStream 클래스의 주요 메소드

🍀리턴 타입🍀메소드🍀설명
intread()1byte를 읽고 읽은 바이트를 리턴한다.
intread(byte[] b)읽은 바이트를 매개값으로 주어진 배열에 저장 , 읽은 바이트 수를 리턴.
intread(byte[] b, int off, int len)len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off] 부터 len개까지 저장. 그리고 읽은 바이트 수 리턴.
voidclose()입력 스트림을 닫는다.

📌read() 메소드

🍀read() 메소드는 입력 스트림으로부터 1byte를 읽고 int(4byte) 타입으로 리턴


📍입력 스트림에서 5개의 바이트가 들어온다면 read()메소드로 1byte씩 5번 읽을 수 있다.

import java.io.FileInputStream;
import java.io.InputStream;

public class ReadExample {
	public static void main(String args[]) throws Exception {
    	InputStream is = new FileInputStream("C:/Temp/test1.db);
        while(true) {
        	int data = is.read();		//1byte씩 읽기
            if(data == -1) break;		//파일 끝에 도달했을 경우
            System.out.println(data);
        }
        is.close();		//입력 스트림 닫음
    }
}

📍실행 결과
10
20
30


📌read(byte[] b) 메소드

🍀read(byte[] b) 메소드는 입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트를 읽고 해당 배열에 저장, 그리고 읽은 바이트 수를 리턴

🍀실제로 읽은 바이트 숙 배열의 길이보다 적을 경우, 읽은 수만큼만 리턴

📍배열 길이 만큼 읽기

import java.io.FileInputStream;
import java.io.Inputstream;

public class ReadExample {
	public static void main(String args[]) {
    	InputStream in = new FileInptuStream("C:/Temp/test2.db);
        
        byte[] buffer = new byte[100];		//길이가 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();
    }
}   
        

📍실행 결과
10
20
30

📍많은 양의 바이트를 읽을 때는 read()(byte b) 메소드를 사용하는 것이 좋다.

🍀 read(byte[] b) 메소드는 한 번 읽을 때 배열 길이만큼 읽기 때문에 읽는 횟수가 현저히 줄어든다.


📌read(byte b, int off, int len) 메소드

🍀 read(byte b, int off, int len) 메소드는 입력 스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다.

그리고 읽은 바이트 수인 len개를 리턴 한다.

🍀 read(byte b, int off, int len) 역시 입력 스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴한다.

📌read (byte[] b)와의 차이점

🍀 read(byte b, int off, int len) 메소드는 한 번에 읽어들이는 바이트 수를 len 매개값으로 조절할 수 있고, 배열에서 저장이 시작되는 인덱스를 지정할 수 ⭕있다.


📌문자 출력 스트림:Writer

🍀 Writer는 문자 기반 출력 스트림의 최상위 클래스추상 클래스이다.


📍스트림이 기본적으로 가져야 할 메소드 정의

📍Writer의 주요 클래스

🍀리턴 타입🍀메소드🍀설명
voidwrite(int c)매개값으로 주어진 한 문자를 보낸다.
voidwrite(char[] cbuf)매가값으로 주어진 배열의 모든 문자를 보낸다.
voidwrite(char[] cbuf, int off, int len)매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자를 보냄
voidwrite(String str)매개값으로 주어진 문자열을 보냄
voidwrite(String str, int off, int len)매개값으로 주어진 문자열에서 off순번부터 len개까지의 문자를 보냄
voidflush()버퍼에 잔류하는 모든 문자를 출력
voidclose()출력 스트림을 닫는다.

📌write(int c) 메소드

🍀 write(int c) 메소드는 매개 변수로 주어지는 int(4byte)에서
2byte(1개의 문자)만 출력 스트림으로 보내진다.

📍한문자씩 출력하기

import java.io.FileWriter;
import java.io.Writer;

public class WriteExample {
	public static void main(String args[]) {
    	Writet writer = new FileWriter("C:/Temp/test8.txt");
        
        char[] array = { 'A', 'B' , 'C' };
        
        writer.write(array);	//배열의 모든 문자를 출력
        
        writer.flush();
        writer.close();
    }
}

📍결과는 파일 탐색기에서 볼 수 있다.


📌write(char[] cbuf, int off, int len)

🍀 write(char[] cbuf, int off, int len) 메소드는 c[off]부터 len개의 문자를 출력 스트림으로 보낸다.


📌write(String str)와 write(String str, int off, int len)

🍀writer는 문자열을 좀 더 쉽게 보내기 위해write(String str)write(String str, int off, int len)메소드를 제공한다.

🍀write(String str)은 문자열 전제 출력 스트림으로 보내고, write (String str, int off, int len)은 주어진 문자열 off순번부터 len개까지의 문자를 보낸다.


문자 입력 스트림:Reader

🍀 Reader 는 문자 기반 입력 스트림최상위 클래스로 추상 클래스이다.

📍Reader의 주요 클래스

🍀리턴 타입🍀메소드🍀설명
intread()1개의 문자를 읽고 리턴
intread(char[] cbuf)읽은 문자들을 매개값으로 주어진 문자 배열에 저장, 읽은 문자수를 리턴
intread(char[] cbuf, int off, int len)len개의 문자를 읽고 매개값으로 주어진 문자 배열에서 cbuf[off]부터 len개까지 저장, 그리고 읽은 문자수 리턴.
intclose()입력 스트림 닫기

📌read() 메소드

🍀 read() 메소드는 입력 스트림으로부터 1개의 문자(2byte)를 읽고 int(4byte)타입으로 리턴

🍀read() 메소드가 리턴한 int값char타입으로 변환하면 읽은 문자 얻기⭕

char charDate = (char) read();

📌read(char cbuf) 메소드

🍀 read(char cbuf) 메소드는 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장. 그리고 읽은 문자 수를 리턴


📌read(char[] cbuf, int off, int len) 메소드

🍀read(char[] cbuf, int off, int len) 메소드는 입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열에서 cbuf[off]부터 len개까지 저장.

Reader reader = ...;
char[] cbuf = new char[100];
int readCharNo=is.read(cbuf);
Reader reader = ...;
char[] cbuf = new char[100];
int readCharNo=is.read(cbuf, 0, 100);

📌5가지 키워드

🍀입출력 스트림

  • 자바에서 테이터는 스트림을 통해 입출력.
  • 도착지출발지냐에 따라 스트림 종류가 결정됨.
  • 도착지이면 흘러온 데이터를 입력받아야 하므로 입력 스트림 사용
  • 출발지면 데이터를 출력해야 하므로 출력 스트림 사용.

🍀 InputStream

  • 바이트 기반 입력 스트림의 최상위 클래스추상 클래스이다.
  • 모든 바이트기반 입력 스트림은 InputStream 클래스를 상속받아 만들어짐.
  • InputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메소드가 정의 되어 있다.

🍀OutputStream

  • 바이트 기반 입력 스트림의 최상위 클래스추상 클래스이다.
  • 모든 바이트기반출력 스트림은 OutputStream 클래스를 상속받아 만들어짐.
  • OutputStream 클래스에는 바이트 기반 출력 스트림이 기본적으로 가져야 할 메소드가 정의 되어 있다.

🍀Reader

  • 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스 이다.
  • 모든 문자 기반 입력 스트림은 Reader 클래스를 상속받아 만들어짐.
  • Reader 클래스에는 문자 기반 입력 스트림이 기본적으로 가져야 할 메소드가 정의 되어 있다.

🍀Writer

  • 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스 이다.
  • 모든 문자 기반 입력 스트림은 Writer 클래스를 상속받아 만들어짐.
  • Writer 클래스에는 문자 기반 입력 스트림이 기본적으로 가져야 할 메소드가 정의 되어 있다.

📍마무링~
여기까지 길었지만 짧았던 혼공자바 혼공단이 마무리 되었다.
사실 마지막 미션을 하면서 필수 미션은 아니지만 선택적 미션을 꼭 하고 싶었는데 내가 아직 거기까지 하기에는 좀 더 공부를 해야겠다는 생각이 들어 나중에 꼭 다시 블로그를 쓸 계획이다. 9기 홍공단은 끝이 났지만 계속해서 나올 혼공단을 기대하고 나는 꾸준히 혼자 공부를 열심히 할 계획이다.!!! 짧은 시간안에 이 두꺼운 책을 끝낼 수 있을까 하는 고민도 있었지만 혼공족장님의 먹을것 조공!!과 계획을 잘 짜지 못하는 극 mbti p에게 계획을 세워주셔서 감사할 따름이다!


번외편..
내 자아..
끼약 끝낫어ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ끼야야야야갸ㅐ갸갸야갹ㅇ

profile
fire-irror

0개의 댓글