
스트림(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();
}
}
참고 :
- 혼자 공부하는 자바(신용권), 한빛미디어
반응형
'개발 > JAVA' 카테고리의 다른 글
[Spring] 스프링이란? 왜 레거시에서 spring boot를 쓰게된걸까? (2) | 2022.11.03 |
---|---|
[Java] 보조 스트림 (0) | 2022.08.20 |
[Java] 컬렉션 프레임워크 - Map (0) | 2022.08.14 |
[Java] 컬렉션 프레임워크 - List, Set (0) | 2022.08.14 |
[Java] 스레드 제어 (0) | 2022.07.27 |