목차
입출력 스트림
프로그램은 데이터를 읽고 출력하는 작업을 빈번히 수행한다. 데이터는 키보드를 통해 입력될 수도 있고, 파일 또는 네트워크로부터 입력될 수도 있다. 반대로 모니터로 출력될 수도 있고, 파일 또는 네트워크로 출력될 수도 있다. 데이터를 읽고 출력하기 위해 사용되는 입출력 API에 대해 알아보자.
자바에서 데이터는 스트림(Stream)을 통해 입출력된다. 스트림은 단일 방향으로 연속적으로 흘러가는 것을 말한다. 프로그램이 도착지면 흘러온 데이터를 입력 받아야 하므로 입력 스트림을 사용하고, 프로그램이 출발지면 데이터를 출력해야 하므로 출력 스트림을 사용한다.
입출력 스트림의 종류
바이트(Byte) 기반 스트림 : 그림, 멀티미티어 등의 바이너리 데이터를 읽고 출력할 때 사용
문자(character) 기반 스트림 : 문자 데이터를 읽고 출력할 때 사용
바이트 출력 스트림 : OutputStream
OutputStream은 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.
FileOutputStream, PrintStream, BufferedOutputStream, DataOutputStream 클래스는 모두 OutputStream 클래스를 상속한다.
write(int b) 메소드
write(int b) 메소드는 매개 변수로 주어지는 int(4byte)에서 끝 1byte만 출력 스트림으로 보낸다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WriteExample {
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();
}
}
|
cs |
write() 메소드로 1byte씩 세 번 출력하는 코드이다. 출력 스트림은 출력할 바이트를 바로 보내는 것이 아니라 내부 버퍼(저장소)에 우선 저장해놓고, flush() 메소드 호출으로 내부 버퍼에 잔류된 바이트를 모두 출력한다.
write(byte[] b) 메소드
write(byte[] b) 메소드는 매개값으로 주어진 배열의 모든 바이트를 출력 스트림으로 보낸다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WrtieExample {
public static void main(String[] args) throws Exception {
OutputStream os = new FileOutputStream("C:/Temp/test2.db");
byte[] array = {10, 20, 30};
os.write(array);
os.flush();
os.close();
}
}
|
cs |
바이트 입력 스트림 : InputStream
InputStream은 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스이다. FileInputStream, BufferedInputStream, DataInputStream 클래스는 모두 InputStream 클래스를 상속한다.
read() 메소드
read() 메소드는 입력 스트림으로부터 1byte를 읽고 int(4byte) 타입으로 리턴한다. 리턴된 4byte 중 끝 1byte만 데이터가 들어가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.io.FileInputStream;
import java.io.InputStream;
public class ReadExample {
public static void main(String[] args) throws Exception {
// 데이터 출발지를 test1.db로 하는 바이트 기반 파일 입력 스트림 생성
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();
}
}
|
cs |
read(byte[] b) 메소드
read(byte[] b) 메소드는 입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트를 읽고 해당 배열에 저장하고, 읽은 바이트 수를 리턴한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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/test2.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();
}
}
|
cs |
길이가 100인 배열을 생성하고 read(byte[] b) 메소드로 한꺼번에 100byte를 읽고 배열에 저장한다. 파일에서 읽을 수 있는 바이트 수만큼 읽는다. 많은 양의 바이트를 읽을 때는 이 메소드를 사용하는 것이 좋다.
read(byte[] b, int off, int len) 메소드
read(byte[] b, int off, int len) 메소드는 입력 스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 읽은 바이트 수인 len개를 리턴한다. 실제로 읽은 바이트 수가 len개보다 작을 경우 읽은 수만큼만 리턴한다. read(byte[] b)와의 차이점은 한 번에 읽어들이는 바이트 수를 len 매개값으로 조절할 수 있고, 배열에서 저장이 시작되는 인덱스를 지정할 수 있다는 점이다. 만약 off를 0으로, len을 배열의 길이로 준다면 read(byte[] b)와 동일하다.
문자 출력 스트림 : Writer
Writer는 문자 기반 출력 스트림의 최상위 클래스로 추상 클래스이다. FileWriter, BufferedWriter, PrintWriter, OutputStreamWriter 클래스는 모두 Writer 클래스를 상속하고 있다.
write(int c) 메소드
write(int c) 메소드는 매개 변수로 주어지는 int(4byte)에서 끝 2byte(1개의 문자)만 출력 스트림으로 보낸다. 매개 변수가 int 타입이므로 4byte를 모두 보내는 것이 아니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.io.FileWriter;
import java.io.Writer;
public class WriteExample {
public static void main(String[] args) throws Exception {
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();
}
}
|
cs |
데이터 도착지를 test7.txt로 하는 문자 기반 파일 출력 스트림을 생성했다. 13-15라인은 write() 메소드로 한 문자(2byte)씩 세 번 출력하는 코드이다.
flush() 메소드는 이 내부 버퍼에 잔류된 문자들을 모두 출력하는 역할을 한다.
write(char[] cbuf) 메소드
write(char[] cbuf) 메소드는 매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import java.io.FileWriter;
import java.io.Writer;
public class WriteExample {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/test8.txt");
char[] array = {'A', 'B', 'C'};
writer.write(array);
writer.flush();
writer.close();
}
}
|
cs |
위 예제는 'A', 'B', 'C'가 저장된 배열을 test8.txt 내용으로 저장한다.
write(char[] cbuf, int off, int len) 메소드
write(char[] cbuf, int off, int len) 메소드는 c[off]부터 len개의 문자를 출력 스트림으로 보낸다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.io.FileWriter;
import java.io.Writer;
public class WriteExample {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/test9.txt");
char[] array = {'A', 'B', 'C', 'D', 'E'};
// 배열의 1번 인덱스부터 3개를 출력
writer.write(array, 1, 3);
// 'B', 'C', 'D'가 저장된다.
writer.flush();
writer.close();
}
}
|
cs |
write(String str) 메소드
Writer는 문자열을 좀 더 쉽게 보내기 위해 write(String str)와 write(String str, int off, int len) 메소드를 제공한다.
wirte(String str)은 문자열 전체를 출력 스트림으로 보내고, write(String str, int off, int len)은 주어진 문자열 off 순번부터 len개까지의 문자를 보낸다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.io.FileWriter;
import java.io.Writer;
public class WriteExample {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/test10.txt");
String str = "ABC";
writer.write(str);
writer.flush(); // test10.txt에 "ABC" 저장
writer.close();
}
}
|
cs |
문자 입력 스트림 : Reader
Reader는 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스이다. FileReader, BufferedReader, InputStreamReader 클래스는 모두 Reader 클래스를 상속한다.
read() 메소드
read() 메소드는 입력 스트림으로부터 1개의 문자(2byte)를 읽고 int(4byte) 타입으로 리턴한다. 리턴된 4byte 중 끝에 있는 2byte에 문자 데이터가 들어 있다. read() 메소드가 리턴한 int 값을 char 타입으로 변환하면 읽은 문자를 얻을 수 있다.
char charData = (char)read();
더 이상 스트림으로부터 문자를 읽을 수 없다면 read() 메소드는 -1를 리턴한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.io.FileReader;
import java.io.Reader;
public class ReadExample {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/test7.txt");
while(true) {
int data = reader.read();
if(data == -1) break;
System.out.println((char)data);
// 출력
// A
// B
// C
}
reader.close();
}
}
|
cs |
read(char[] cbuf) 메소드
read(char[] cbuf) 메소드는 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장한다. 그리고 읽은 문자 수를 리턴한다. 실제로 읽은 문자 수가 배열의 길이보다 적을 경우 읽은 수만큼만 리턴한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.io.FileReader;
import java.io.Reader;
public class ReadExample {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/test8.txt");
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]);
// A
// B
// C
}
}
reader.close();
}
}
|
cs |
많은 양의 문자를 읽을 때는 read(char[] cbuf) 메소드를 사용하는 것이 좋다.
read(char[] cbuf, int off, int len) 메소드
read(char[] cbuf, int off, int len) 메소드는 입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자 배열에서 cbuf[off]부터 len개까지 저장한다. 그리고 읽은 문자 수인 len개를 리턴한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.io.FileReader;
import java.io.Reader;
public class ReadExample {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/test9.txt");
char[] buffer = new char[5];
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();
}
}
|
cs |
'개발 관련 > Java' 카테고리의 다른 글
[Java] 멀티 스레드(Multi Thread) (0) | 2022.10.05 |
---|---|
[혼공자] LIFO와 FIFO 컬렉션(Stack, Queue) (0) | 2022.04.28 |
[혼공자] 컬렉션 프레임워크(Collection Framework) #03 Map (0) | 2022.04.28 |
[혼공자] 컬렉션 프레임워크(Collection Framework) #02 Set (0) | 2022.04.28 |
[혼공자] 컬렉션 프레임워크(Collection Framework) #01 List(ArrayList, Vector, LinkedList) (0) | 2022.04.28 |