위로
아래
입출력 스트림
입출력 스트림(IO Stream)의 특징
- 키보드 및 모니터의 입출력뿐만 아니라, 프로그램과 외부 장치나 파일 사이의 데이터 흐름도 스트림이다.
- 선입선출 : 먼저 들어간 것이 먼저 나오는 구조
- 임의 접근 파일 스트림을 제외한 모든 스트림은 단방향
- 입출력 스트림은 객체
- 출력 스트림과 입력 스트림을 연결해서 파이프라인 구성 가능
- 지연 가능
- System.out : 표준 출력 스트림
- System.in : 표준 입력 스트림
- java.base 모듈에 포함된 java.io 패키지를 이용해 스트림 클래스를 제공
- 입출력 스트림의 사용 : 스트림 opne -> 스트림 처리 -> 스트림 close 과정을 거쳐야 한다.
입력 스트림과 출력 스트림
- 입력 스트림 : 대상으로부터 자료를 읽어들이는 스트림
- 종류 : InputStream, Reader 붙은 애들
- 출력 스트림 : 대상으로 자료를 출력하는 스트림
- 종류 : OutputStream, Writer 붙은 애들
기반 스트림과 보조 스트림
- 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
- 종류 : FileInputStream, FileOutputStream, FileReader, FileWriter
- 보조(필터) 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림. 항상 기반 스트림이나 또 다른 보조 스트림을 생성자 매개변수로 포함.
- 종류 : InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream
바이트 스트림
바이트 스트림 (byte stream)
- 이름이 InputStream과 OutputStream으로 끝난다.
- 바이트 단위로 전송한다.
- 이진 데이터를 처리하기 때문에 바이너리 스트림(binary stream)이라고도 한다.
- 바이트 스트림 생성자의 매개변수는 바이트 스트림의 최상위 클래스인 InputStream과 OutputStream타입.
- 이미지나 동영상 파일을 처리할 때 유용하다.
바이트 스트림 종류
바이트 스트림 : InputStream과 OutputStream
- read() 메소드의 반환값은 0~255의 ASCII값이며, 더이상 읽을 데이터가 없을 때는 -1을 반환
- read() 메소드는 int 타입을 반환
- write() 메소드에서 인수가 배열일 때는 byte[], 배열이 아닐 때는 int 타입
- 대부분 운영체제나 JVM은 표준 출력 장치를 효육적으로 관리하려고 버퍼 사용
- 표준출력 System.out은 버퍼를 사용하기 때문에, flush() 메소드를 호출해서 스트림을 닫기 전에 버퍼를 강제로 비울 수 있다.
- 둘 다 추상클래스이기 때문에 객체를 생성할 수 없어서, 자식인 구현 클래스를 사용해야 한다.
InputStream의 주요 메소드
- available() : 읽을 수 있는 바이트 개수 반환 (int)
- close() : 입력 스트림을 닫는다
- read() : 1바이트를 읽는다
- read(byte b[]) : 1바이트씩 읽어 b[]에 저장한 후 읽은 개수를 반환 (int)
- skip(long n) : 입력 스트림을 n바이트만큼 건너뛴다.
OutputStream의 주요 메소드
- close() : 출력 스트림을 닫는다.
- flush() : 출력하려고 버퍼의 내용을 비운다
- write(int b) : b 값을 바이트로 변환해서 쓴다.
- write(byte b[]) : b[] 값을 쓴다.
예시
더보기
![](https://blog.kakaocdn.net/dn/UXT8x/btssVOjQVAB/CB8hwBjrFyUn6Ch8wnG4z0/img.png)
import java.io.IOException;
public class IOStreamDemo {
public static void main(String[]args) throws IOException {
int b, len = 0;
int ba[] = new int[100];
System.out.println("--- 입력 스트림 ----");
while((b=System.in.read())!='\n') { // int 타입으로 입력 받는다.
System.out.printf("%c(%d)",(char)b,b); // 문자에 대한 아스키코드 값을 출력
ba[len++] = b; // 0~99 or 엔터칠 때까지 받는다
}
System.out.println("\n\n --- 출력 스트림 ---");
for (int i = 0; i < len ; i ++)
System.out.write(ba[i]); // 길이만큼, 배열의 하나씩 출력
System.out.flush(); // System.out.close(); // 비워준다
}
}
![](https://blog.kakaocdn.net/dn/UXT8x/btssVOjQVAB/CB8hwBjrFyUn6Ch8wnG4z0/img.png)
바이트 스트림 : FileInputStrea과 FileOutputStream
- 시스템에 있는 파일을 읽거나 쓸 수 있는 기능 제공
- 파일 경로 문자열이나 파일 객체를 생성자의 매개변수로 사용해서 객체 생성
- 생성자로 입출력 스트림 객체를 생성할 때에는 FIleNotFoundException 예외 가능성이 있으므로 예외처리 필요
예시
더보기
![](https://blog.kakaocdn.net/dn/AsLtc/btssPwyjjdU/niJrLVE2kvFpfigCNAxIKk/img.png)
import java.io.*;
public class CopyFileDemo {
public static void main(String[] args) {
String input = "D:\\Temp\\org.txt";
String output = "D:\\Temp\\dup.txt";
try(FileInputStream fis = new FileInputStream(input);
FileOutputStream fos = new FileOutputStream(output)){
int c;
while ((c = fis.read()) != -1)
fos.write(c);;
} catch(IOException e) {}
}
}
![](https://blog.kakaocdn.net/dn/AsLtc/btssPwyjjdU/niJrLVE2kvFpfigCNAxIKk/img.png)
바이트 스트림 : BufferedInputStream과 BufferedOutputStream
- 버퍼(buffer) : 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메모리
- 입출력 장치와 프로그램 간 동작 속도가 크게 차이날 때 사용하면 효율적이다
예시
더보기
![](https://blog.kakaocdn.net/dn/deDXTl/btssZdX4zQT/ll1yBKkjHCDCzJRgImisdK/img.png)
import java.io.*;
public class BufferedStreamDemo {
public static void main(String[] args) {
long start, end, duration;
String org = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
String dst = "D:\\Temp\\chrome1.exe";
start = System.nanoTime();
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(org));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dst));){
while(bis.available() > 0) {
int b = bis.read();
bos.write(b);
}
bos.flush();
} catch(IOException e) {}
end = System.nanoTime();
duration = end - start;
System.out.println("버퍼를 사용한 경우 : " + duration);
start = System.nanoTime();
try (FileInputStream fis = new FileInputStream(org);
FileOutputStream fos = new FileOutputStream(dst);){
while (fis.available()>0) {
int b = fis.read();
fos.write(b);
}
//fos.flush();
} catch(IOException e) {}
end = System.nanoTime();
duration = end - start;
System.out.println("버퍼를 사용하지 않은 경우 : " + duration);
}
}
![](https://blog.kakaocdn.net/dn/deDXTl/btssZdX4zQT/ll1yBKkjHCDCzJRgImisdK/img.png)
바이트 스트림 : DataInputStream과 DataOutputStream
- DataInput과 DataOutput 인터페이스를 구현한 FilterInputStream과 FilterOutputStream의 자식 클래스이다.
- 직접 키보드에서 데이터를 입력받거나 화면에 데이터를 출력하기에는 부적합하다.
- 그래서 다른 스트림과 연결해서 파이프라인을 구성해 사용한다.
예시
더보기
![](https://blog.kakaocdn.net/dn/mQCFL/btssS4gXHuE/WK1t47hAPoC6Qvr8ZpEULk/img.png)
import java.io.*;
public class DataStreamDemo {
public static void main(String[]args) {
try(DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:\\Temp\\data.dat"));
DataInputStream dis = new DataInputStream(new FileInputStream("D:\\Temp\\data.dat"));
){
dos.writeDouble(1.0);
dos.writeInt(1);
dos.writeUTF("one");
dos.flush();
System.out.println(dis.readDouble());
System.out.println(dis.readInt());
System.out.println(dis.readUTF());
} catch(IOException e) {
}
}
}
![](https://blog.kakaocdn.net/dn/mQCFL/btssS4gXHuE/WK1t47hAPoC6Qvr8ZpEULk/img.png)
바이트 스트림 : PrintStream
- 다양한 데이터 값을 편리하게 출력할 수 있는 기능을 추가한 OutputStream의 하위 클래스이다.
- IOException 발생 X
- 자동 플러시 기능을 제공해서 flush() 메소드 없이도 버퍼 비울 수 있다.
문자 스트림
문자 스트림 (character stream)
- 문자 스트림의 이름은 Reader와 Writer로 끝난다.
- 2바이트 단위로 전송한다.
문자 스트림 종류
문자 스트림 : Reader와 Writer
- 모든 자식 문자 스트림에서 공통으로 사용되는 다양한 메소드를 가진 문자 스트림의 최상위 클래스
- 추상 메소드인 read(), close(), write(), flush()를 포함하고 있는 추상 클래스
Reader 메소드 종류
- close() : 입력 스트림을 닫는다
- read() : 1개의 문자를 읽는다
- read(char[] c) : 문자 단위로 읽어 c[]에 저장한 후 읽은 개수를 반환
- skip(long n) : 입력 스트림을 n문자만큼 건너뛴다.
Writer 메소드 종류
- close() : 출력 스트림을 닫는다.
- flush() : 버퍼의 내용을 비운다.
- write(int c) : c 값을 char로 변환해 출력 스트림에 쓴다.
- write(char c[]) : c[]값을 char로 변환해 출력 스트림에 쓴다.
- write(String str) : 문자열 str을 출력 스트림에 쓴다.
문자 스트림 : FileReader와 FileWriter
- 문자 파일을 읽거나 파일에 쓸 수 있는 기능을 제공
- 생성자로 생성할 때에는 FileNotFoundException 예외 가능성이 있으므로 예외 처리를 해야한다.
예시
더보기
![](https://blog.kakaocdn.net/dn/bdpMB4/btssSpZZnZM/fkWGKJ3ZmSTPnHZjLWV0hK/img.png)
import java.io.*;
public class CopyFileDemo2 {
public static void main(String[] args) {
String input = "D:\\Temp\\org.txt";
String output = "D:\\Temp\\dup.txt";
try(FileReader fr = new FileReader(input);
FileWriter fw = new FileWriter(output)){
int c;
while ((c = fr.read()) != -1)
fw.write(c);
} catch(IOException e) {}
}
}
![](https://blog.kakaocdn.net/dn/bdpMB4/btssSpZZnZM/fkWGKJ3ZmSTPnHZjLWV0hK/img.png)
문자 스트림 : BufferedReader와 BufferedWriter
- 스트림의 효율을 높이려고 버퍼를 사용하는 입출력 스트림.
- lines() 메소드를 이용하면 스트림을 생성할 수 있다.
- 제공하는 메소드
- lines() : 읽은 행을 스트림으로 반환
- readLine() : 한 행을 읽어 문자열로 반환
예시
더보기
![](https://blog.kakaocdn.net/dn/cgd3xh/btssTolVsYH/4kbrTN6RKwa1Vc2GAw3Xik/img.png)
import java.io.*;
public class BufferReaderDemo {
public static void main(String[] args) {
try(BufferedReader br = new BufferedReader(new FileReader("D:\\Temp\\org.txt"));){
br.lines().forEach(s -> System.out.println(s));
} catch(IOException e) {}
}
}
![](https://blog.kakaocdn.net/dn/cgd3xh/btssTolVsYH/4kbrTN6RKwa1Vc2GAw3Xik/img.png)
문자 스트림 : PrintWriter
- Writer의 자식 클래스로 다양한 데이터 값을 출력할 수 있도록 기능을 추가했다.
예시
더보기
import java.io.*;
public class PrintWriterDemo {
public static void main(String[] args) {
try(BufferedReader br = new BufferedReader(new FileReader("D:\\Temp\\org.txt"));
PrintWriter pr = new PrintWriter(new FileWriter("D:\\Temp\\dup.txt"));){
br.lines().forEach(x -> pr.println(x));
} catch (IOException e) {}
}
}