profile image

L o a d i n g . . .

article thumbnail image
Published 2022. 8. 16. 12:50

스트림(Stream)

자바에서 데이터는 Stream을 통해 입출력된다. 스트림은 단일 방향으로 연속적으로 흘러가는 것을 말하는데, 출발지(입력)에서 도착지(출력)으로 흘러간다.

 

 

 

 

 

 

 


입출력 스트림의 종류

java.io 패키지에서 제공하는 스트림 클래스

- 바이트 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용

- 문자 기반 스트림: 문자데이터를 읽고 출력할 때 사용

 

구분 바이트기반 스트림 문자기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스(ex) XXXInputStream
(FileInputStream)
XXXOutputStream
(FileOutputStream)
XXXReader
(FileReader)
XXXWriter
(FileWriter)

 

 

바이트 출력 스트림: OutputStream

 

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

 

OutputStream 클래스의 주요 메소드

리턴 타입 메소드 설명
void write(int b) 1byte를 출력
void write(byte[] b) 매개값으로 주어진 배열b의 모든 바이트 출력
void write(byte[] b, int off, int len) 매개값으로 주어진 배열b[off]부터 len개까지의 바이트 출력
void flush() 출력 버퍼에 잔류하는 모든 바이트 출력
void close() 출력 스트림 종료

 

 

 

 


 

package a220816;

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

public class WriteEx {
	public static void main(String[] args) throws Exception {
		OutputStream os = new FileOutputStream("C:/Temp/test1.db");
		
		byte a  = 10;
		byte b  = 20;
		byte c  = 30;
		
		os.write(a);
		os.write(b);
		os.write(c);
		
		os.flush();
		os.close();
	}
}

Temp폴더에 도착하는 test1.db바이트기반 파일 출력스트림을 생성해

1바이트씩 출력하는 예제

 

 

 

 

 

 

 


바이트 입력 스트림: InputStream

모든 바이트 입력 스트림 클래스는 InputStream클래스를 상속받아서 만들어진다.

 

 

리턴타입 메소드 설명
int read() 1bute를 읽고, 읽은 바이트 리턴
int read(byte[] b) 읽은 바이트를 매개값으로 주어진 배열에 저장하고 읽은 바이트 수를 리턴
int read(byte[] b, int off, int len) len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off]부터 len개까지 저장 후 읽은 바이트 수 리턴
void  close() 입력 스트림 종료

 

 

 

 


package a220816;

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

public class ReadEx {
	public static void main(String[] args) throws IOException {
		InputStream is = new FileInputStream("C:/Temp/test1.db");
		
		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();
	}
}

길이가 100인 배열을 생성하고 read(byte[] b)메소드로 한꺼번에 읽고 배열에 저장한다.

 

 

 

 

 


package a220816;

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

public class ReadEx1 {
	public static void main(String[] args) throws Exception {
		InputStream is = new FileInputStream("C:/Temp/test2.db");
		
		byte[] buffer = new byte[5];
		
		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();
	}
}

이전에 outputstream 연습 시 만들어둔 test2.db에서 3byte를 읽고, 길이 5인 배열의 배열인덱스 2,3,4에 저장한다

그다음 배열 전체를 읽은 후 출력

 

 

 

 

 

 

 

 


문자 출력 스트림: Writer

리턴타입 메소드 설명
void write(ind c) 매개값으로 주어진 한 문자를 보냄
void write(char[] cbuf) 매개값으로 주어진 배열의 모든 문자를 보냄
void write(char[] cbuf, int off, int len) 매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자보냄
void write(String str) 매개값으로 주어진 문자열을 보냄
void write(String str, int off, int len) 매개값으로 주어진 문자열에서 cbuf[off]부터 len개까지의 문자보냄
void flush() 버퍼에 잔류하는 모든 문자 출력
void close() 출력 스트림 종료

 

package a220816;

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

public class WriteEx2 {
	public static void main(String[] args) throws IOException {
		Writer writer = new FileWriter("c:/Temp/test8.txt");
		
		char a = 'A';
		char b = 'B';
		char c = 'C';
		
		char[] array = { 'D', 'E', 'F' , 'D', 'E', 'F' };
		
		writer.write(a);
		writer.write(b);
		writer.write(c);
		
		writer.write(array, 0, 3);
		
		writer.flush();
		writer.close();
	}
}

test8에 문자, 배열을 보내보았다.

문자열을 보낼때는 범위를 지정해서 write(String str, int off, int len)메소드를 사용했다

 

 

 


문자 입력 스트림: Reader

 

읽을땐 read메소드를 사용한다

 

package a220816;

import java.io.FileReader;
import java.io.Reader;

public class ReadEx21 {
	public static void main(String[] args) throws Exception {
		Reader reader = new FileReader("C:/Temp/test8.txt");
		
		while (true) {
			int data = reader.read();
			if (data == -1) { break; };
			System.out.print((char)data);
		}
		System.out.println();
		reader.close();
		
		Reader reader1 = new FileReader("C:/Temp/test8.txt");
		
		char[] buffer = new char[5];
		
		int readCharNum = reader1.read(buffer, 2, 3);
		if (readCharNum != -1) {
			for (int i = 0; i < buffer.length; i++) {
				System.out.println("readCharNum: " + buffer[i]);
			}
		}
		reader1.close();
	}
}

 

 

 

 

 

 

 

 

참고 :

- 혼자 공부하는 자바(신용권), 한빛미디어

반응형
복사했습니다!