위로 아래

입출력 스트림

입출력 스트림(IO Stream)의 특징

  1. 키보드 및 모니터의 입출력뿐만 아니라, 프로그램과 외부 장치나 파일 사이의 데이터 흐름도 스트림이다.
  2. 선입선출 : 먼저 들어간 것이 먼저 나오는 구조
  3. 임의 접근 파일 스트림을 제외한 모든 스트림은 단방향
  4. 입출력 스트림은 객체
  5. 출력 스트림과 입력 스트림을 연결해서 파이프라인 구성 가능
  6. 지연 가능 
  7. System.out : 표준 출력 스트림
  8. System.in : 표준 입력 스트림
  9. java.base 모듈에 포함된 java.io 패키지를 이용해 스트림 클래스를 제공
  10. 입출력 스트림의 사용 : 스트림 opne -> 스트림 처리 -> 스트림 close 과정을 거쳐야 한다.

 

입력 스트림과 출력 스트림

  1. 입력 스트림 : 대상으로부터 자료를 읽어들이는 스트림
    1. 종류 : InputStream, Reader 붙은 애들
  2. 출력 스트림 : 대상으로 자료를 출력하는 스트림
    1. 종류 : OutputStream, Writer 붙은 애들

 

기반 스트림과 보조 스트림

  1. 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
    1. 종류 : FileInputStream, FileOutputStream, FileReader, FileWriter
  2. 보조(필터) 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림. 항상 기반 스트림이나 또 다른 보조 스트림을 생성자 매개변수로 포함.
    1. 종류 : InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream

 


바이트 스트림

바이트 스트림 (byte stream)

  1. 이름이 InputStream과 OutputStream으로 끝난다.
  2. 바이트 단위로 전송한다. 
  3. 이진 데이터를 처리하기 때문에 바이너리 스트림(binary stream)이라고도 한다.
  4. 바이트 스트림 생성자의 매개변수는 바이트 스트림의 최상위 클래스인 InputStream과 OutputStream타입.
  5. 이미지나 동영상 파일을 처리할 때 유용하다.

 

바이트 스트림 종류

 

 


바이트 스트림 : InputStream과 OutputStream

  1. read() 메소드의 반환값은 0~255의 ASCII값이며, 더이상 읽을 데이터가 없을 때는 -1을 반환
  2. read() 메소드는 int 타입을 반환
  3. write() 메소드에서 인수가 배열일 때는 byte[], 배열이 아닐 때는 int 타입
  4. 대부분 운영체제나 JVM은 표준 출력 장치를 효육적으로 관리하려고 버퍼 사용
  5. 표준출력 System.out은 버퍼를 사용하기 때문에, flush() 메소드를 호출해서 스트림을 닫기 전에 버퍼를 강제로 비울 수 있다.
  6. 둘 다 추상클래스이기 때문에 객체를 생성할 수 없어서, 자식인 구현 클래스를 사용해야 한다.

 

InputStream의 주요 메소드

  1. available() : 읽을 수 있는 바이트 개수 반환 (int)
  2. close() : 입력 스트림을 닫는다
  3. read() : 1바이트를 읽는다
  4. read(byte b[]) : 1바이트씩 읽어 b[]에 저장한 후 읽은 개수를 반환 (int)
  5. skip(long n) : 입력 스트림을 n바이트만큼 건너뛴다.

 

OutputStream의 주요 메소드

  1. close() : 출력 스트림을 닫는다.
  2. flush() : 출력하려고 버퍼의 내용을 비운다
  3. write(int b) : b 값을 바이트로 변환해서 쓴다.
  4. write(byte b[]) : b[] 값을 쓴다.

 

 

예시

더보기
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();   // 비워준다
	}
}

 

 

 


 

바이트 스트림 : FileInputStrea과 FileOutputStream

  1. 시스템에 있는 파일을 읽거나 쓸 수 있는 기능 제공
  2. 파일 경로 문자열이나 파일 객체를 생성자의 매개변수로 사용해서 객체 생성
  3. 생성자로 입출력 스트림 객체를 생성할 때에는 FIleNotFoundException 예외 가능성이 있으므로 예외처리 필요

 

예시

더보기
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) {}
		
	}
}

 

 


바이트 스트림 : BufferedInputStream과 BufferedOutputStream

  1. 버퍼(buffer) : 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메모리
  2. 입출력 장치와 프로그램 간 동작 속도가 크게 차이날 때 사용하면 효율적이다

 

예시

더보기
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);
	}
}

 

 

 


바이트 스트림 : DataInputStream과 DataOutputStream

  1.  DataInput과 DataOutput 인터페이스를 구현한 FilterInputStream과 FilterOutputStream의 자식 클래스이다.
  2. 직접 키보드에서 데이터를 입력받거나 화면에 데이터를 출력하기에는 부적합하다.
  3. 그래서 다른 스트림과 연결해서 파이프라인을 구성해 사용한다.

 

예시

더보기
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) {
			
		}
				
	}
}

 

 

 


바이트 스트림 : PrintStream

  1. 다양한 데이터 값을 편리하게 출력할 수 있는 기능을 추가한 OutputStream의 하위 클래스이다.
  2. IOException 발생 X
  3. 자동 플러시 기능을 제공해서 flush() 메소드 없이도 버퍼 비울 수 있다.

 

 

 


문자 스트림

문자 스트림 (character stream)

  1. 문자 스트림의 이름은 Reader와 Writer로 끝난다.
  2. 2바이트 단위로 전송한다.

 

문자 스트림 종류

 

 

 


문자 스트림 : Reader와 Writer

  1. 모든 자식 문자 스트림에서 공통으로 사용되는 다양한 메소드를 가진 문자 스트림의 최상위 클래스
  2. 추상 메소드인 read(), close(), write(), flush()를 포함하고 있는 추상 클래스

 

Reader 메소드 종류

  1. close() : 입력 스트림을 닫는다
  2. read() : 1개의 문자를 읽는다
  3. read(char[] c) : 문자 단위로 읽어 c[]에 저장한 후 읽은 개수를 반환
  4. skip(long n) : 입력 스트림을 n문자만큼 건너뛴다.

 

Writer 메소드 종류

  1. close() : 출력 스트림을 닫는다.
  2. flush() : 버퍼의 내용을 비운다.
  3. write(int c) : c 값을 char로 변환해 출력 스트림에 쓴다.
  4. write(char c[]) : c[]값을 char로 변환해 출력 스트림에 쓴다.
  5. write(String str) : 문자열 str을 출력 스트림에 쓴다.

 

 

 


문자 스트림 : FileReader와 FileWriter

  1. 문자 파일을 읽거나 파일에 쓸 수 있는 기능을 제공
  2. 생성자로 생성할 때에는 FileNotFoundException 예외 가능성이 있으므로 예외 처리를 해야한다. 

 

예시

더보기
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) {}
	}
}

 

 

 


문자 스트림 : BufferedReader와 BufferedWriter

  1. 스트림의 효율을 높이려고 버퍼를 사용하는 입출력 스트림.
  2. lines() 메소드를 이용하면 스트림을 생성할 수 있다.
  3. 제공하는 메소드
    1. lines() : 읽은 행을 스트림으로 반환
    2. readLine() : 한 행을 읽어 문자열로 반환

 

예시

더보기
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) {}
	}
}

 

 

 


문자 스트림 : PrintWriter

  1. 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) {}
	}
}