컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는것을 입출력이라 한다. 장치와 입출력을 하기 위해서는 하드웨어 장치에 직접 접근이 필요한데 다양한 매체에 존재하는 데이터들을 사용하기 위해 입출력 데이터를 처리할 공통적인 방법으로 스트림을 사용한다.
자바에서는 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.
스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다.
먼저 들어간 데이터가 먼저 나오는 형태로 데이터의 순서가 바뀌지 않는다
하나의 스트림에서 입출력이 동시에 이루어 지지 않는다
입력과 출력에 각각 스트림을 열어 사용해야 한다
-> 단점
스트림 내의 데이터가 모두 전송되기 전까지 프로그램이 지연 상태에 빠질 수 있다.
바이트 단위로 데이터를 전송한다. 동용상 이미지 음악 등 바이트로 구성된 파일을 처리하기에 적합하다
바이트 기반 출력 스트림
public static void main(String[] args) throws IOException {
OutputStream os = new FileOutputStream("test.db");
byte a = 10;
byte b = 20;
byte c = 30;
os.write(a);
os.write(b);
os.write(c);
os.flush(); // 버퍼 비우기
os.close(); // 자원 반납 후 스트림 닫기
}
public static void main(String[] args) throws IOException {
OutputStream os = new FileOutputStream("test2.db");
byte[] array = {10, 20, 30};
os.write(array);
os.flush();
os.close();
}
public static void main(String[] args) throws IOException {
OutputStream os = new FileOutputStream("test3.db");
byte[] array = {10, 20, 30, 40, 50};
os.write(array, 1, 3); // 배열의 1번 인댁스 부터 3개 출력
os.flush();
os.close();
}
바이트 기반 입력 스트림
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("test2.db");
while(true) {
int data = is.read(); // 1 바이트씩 읽기
if(data == -1) break; // 파일의 끝에 도달
System.out.println(data);
}
is.close();
}
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("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();
}
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("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();
}
문자단위로 데이터를 전송. 사용방법은 바이트 스트림과 동일하다.
Writer 는 문자열 기반 출력 스트림의 최상위 클래스로 추상클래스이다.
write(int c)
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("test.txt");
char[] data = "곰돌이사육사".toCharArray();
for(int i=0; i<data.length; i++) {
writer.write(data[i]);
}
writer.flush();
writer.close();
}
write(char[] c)
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("test.txt");
char[] data = "곰돌이사육사".toCharArray();
writer.write(data);
writer.flush();
writer.close();
}
write(char[] c, int off, int len)
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("test.txt");
//char[] data = "곰돌이사육사".toCharArray();
String data = "곰돌이사육사";
writer.write(data, 1, 2);
writer.flush();
writer.close();
}
Reader 는 문자열 기반 입력 스트림의 최상위 클래스로 추상클래스이다.
read()
입력 스트림으로 부터 문자를 읽고 int타입으로 리턴한다.
리턴한 int값을 char형으로 변환하면 읽은 문자열을 확인할 수 있다.
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("src/test.txt");
int readData;
while( true ) {
readData = reader.read();
if(readData == -1) break;
System.out.print((char)readData);
}
reader.close();
}
read(char[] cbuf)
입력스트림으로 부터 매개변수로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장하고 읽은 문자 수를 리턴. 실제로 읽은 문자 수가 배열 길이 보다 작을 경우 읽은 수만큼만 리턴
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("src/test.txt");
int readCharNo;
char[] cbuf = new char[10];
String data = "";
while( true ) {
readCharNo = reader.read(cbuf);
if(readCharNo == -1) break;
data += new String(cbuf, 0, readCharNo);
}
System.out.println(data);
reader.close();
}