입출력 스트림

  • 다양한 입출력 장치에서 독립적으로 일관된 입출력을 입출력 스트림을 통해 제공

구분

  • 대상 기준 : 입력 / 출력
  • 자료 종류 : 바이트 / 문자
  • 기능 : 기반 / 보조

1. 입력 스트림과 출력 스트림

  • 입력 스트림 : 대상으로부터 자료를 읽어들이는 스트림
    FileInputStream, FileReader, BufferedInputStream, BufferedReader 등

  • 출력 스트림 : 대상으로 자료를 출력하는 스트림
    FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등

2. 바이트 단위 스트림과 문자 단위 스트림

  • 바이트 단위 스트림 : 동영상, 음악, 실행 파일 등의 자료를 읽고 쓸 때 사용
    FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream 등

  • 문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐, 인코딩에 맞게 2바이트 이상으로 처리하도록 구현된 스트림
    FileReader, FileWriter, BufferedReader, BufferedWriter 등

3. 기반 스트림과 보조 스트림

  • 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
    FileInputStream, FileOutputStream, FileReader, FileWriter 등

  • 보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
    보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개 변수로 포함함
    InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream 등

표준 입출력 스트림

System 클래스의 표준 입출력 멤버

  • System 클래스의 구성은
public class System{ 
	public static PrintStream out; 
	public static InputStream in; 
	public static PrintStream err; 
}
  • System.out은 표준 출력(모니터) 스트림
    System.out.println("출력 메세지");

  • System.in은 표준 입력(키보드) 스트림
    int d = System.in.read() // 한 바이트 읽기

  • System.err는 표준 에러 출력(모니터) 스트림
    System.err.println("에러 메세지");

System.in 사용 예제

  • 알파벳을 입력 받아 처리하는 프로그램
public static void main(String[] args) {
	System.out.println("알파벳 하나를 쓰고 [Enter]를 누르세요");
	
	int i;
	try {
		i = System.in.read();
		System.out.println(i);
		System.out.println((char)i); //char 단위로 출력하기 때문에 한 글자만 가능
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
}
========================


public static void main(String[] args) {
	System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요");
	
	int i;
	try {
		while( (i = System.in.read()) != '\n' ) {
			System.out.print((char)i); //문자열을 안된다
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

========================

public static void main(String[] args) {
	System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요");
	
	int i;
	try {
I		InputStreamReader irs = new InputStreamReader(System.in);
		//InputStreamReader로 한 번 감싸준다
            while ((i = irs.read()) != '\n') {
			System.out.print((char)i); 
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}            

바이트 단위 입출력 스트림

InputStream

  • 바이트 단위 입력 클래스 중에 최상위 클래스

  • FileInputStream
    파일에서 바이트 단위로 자료를 읽습니다.

  • ByteArrayInputStream
    byte 배열 메모리에서 바이트 단위로 자료를 읽습니다.

  • FilterInputStream
    기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스

InputStream 예제

  • 파일에서 한 바이트씩 자료 읽기
public static void main(String[] args) {
	FileInputStream fis = null;
	try {
	    fis = new FileInputStream("input.txt");
	    System.out.println((char)fis.read());//한 바이트씩 읽고 문자로 변환해 반환
	    System.out.println((char)fis.read());
	    System.out.println((char)fis.read());
	} catch (IOException e) { //에러가 발생하면 캐치, 파일이 없는 경우
	    e.printStackTrace(); 
	}finally { //클로징을 해주기 위해 finally
	    try {
	        fis.close(); //파일이 null일 경우 closing 못하니까 
	    } catch (IOException e) { // catch
	        e.printStackTrace();
	    }catch (Exception e2){
	        System.out.println(e2);
	    }
	}
	System.out.println("end");
  • 파일의 끝까지 한 바이트씩 자료 읽기
public static void main(String[] args) {
    int i;
    try(FileInputStream fis = new FileInputStream("input.txt")){ //오토 클로징
        while ((i = fis.read()) != -1){ //파일의 마지막까지
            System.out.print((char)i); //문자 반환
        }
    }catch (IOException e){ //에러 발생하면 캐치
        System.out.println(e);
    }

}
  • 파일에서 바이트 배열로 자료 읽기 ( 배열에 남아 있는 자료가 있을 수 있음에 유의 )
public static void main(String[] args) {
    int i;
    try(FileInputStream fis = new FileInputStream("input2.txt")){ //오토 클로징
        byte[] bs = new byte[10];
        while ((i = fis.read(bs, 1, 9)) != -1){ //배열의 끝이면 -1이니까 배열의 끝까지
            for (int j = 0 ; j < i ; j++){ //i는 fis를 읽어온 배열의 길이이니까
                                            // 10개를 읽었으면 10개 출력하고 6개를 읽었으면 6개 출력
                System.out.print((char)bs[j]);
            }//읽은 배열 출력
            System.out.println(" : " + i + "바이트 읽음");
        }
    }catch (IOException e){
        System.out.println(e);
    }

OutputStream

  • 바이트 단위 출력 스트림 중 최상위 추상클래스

  • 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현함

  • 주요 하위 클래스

    -FileOutputStream
    파일에서 바이트 단위로 자료를 씁니다.

    • ByteArrayOutputStream
      byte 배열 메모리에서 바이트 단위로 자료를 씁니다.
    • FilterOutputStream
      기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
  • 주요 메서드

    • int write()
      한 바이트를 출력합니다.
    • int write(byte b[])
      b[] 크기의 자료를 출력합니다.
    • int write(byte b[], int off, int len)
      b[] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력합니다.
    • void flush()
      출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력합니다.
    • void close()
      출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비워집니다.
  • 파일에 한 바이트씩 쓰기

public static void main(String[] args) {

   try (FileOutputStream fos = new FileOutputStream("output.txt")){
        fos.write(65);
        fos.write(66);
        fos.write(67);
    }catch (IOException e){
        System.out.println(e);
    }
    System.out.println("end");
}
  • byte[] 배열에 A-Z 까지 넣고 배열을 한꺼번에 파일에 쓰기
public static void main(String[] args) throws FileNotFoundException {
    FileOutputStream fos = new FileOutputStream("output2.txt");
    try (fos){
        byte[] bs = new byte[26];
        
        byte data = 65;
        for (int i = 0; i < bs.length; i++) {
            bs[i] = data++;
        }
        fos.write(bs);
    }catch (IOException e){
        System.out.println(e);
    }
    System.out.println("end");
}
  • byte[] 배열의 특정 위치에서 부터 정해진 길이 만큼 쓰기
public static void main(String[] args) throws FileNotFoundException {
    FileOutputStream fos = new FileOutputStream("output3.txt");
    try (fos){
        byte[] bs = new byte[26];
        byte data = 65;
        for (int i = 0; i < bs.length; i++) {
            bs[i] = data++;
        }
        fos.write(bs, 2, 10);//2부터 10개만
    }catch (IOException e){
        System.out.println(e);
    }
    System.out.println("end");
}

문자 단위 입출력 스트림

Reader

  • 문자 단위 입력 스트림의 최상위 추상 클래스

  • 주요 하위 클래스

    • FileReader
      파일에서 문자 단위로 읽는 스트림 클래스입니다.
    • InputStreamReader
      바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 클래스 입니다.
    • BufferedReader
      문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림입니다.
  • 주요 메서드

    • int read()
      파일로부터 한 문자를 읽습니다. 읽은 문자를 반환합니다.
    • int read(char[] buf)
      파일로부터 buf 배열에 문자를 읽습니다.
    • int read(char[] buf, int off, int len)
      파일로부터 buf 배열의 off 위치로부터 len 개수만큼의 문자를 읽습니다.
    • void close()
      입력 스트림과 연결된 대상 리소스를 닫습니다.
  • 파일에서 문자 읽기

public static void main(String[] args) {
    try(FileReader fis = new FileReader("reader.txt")) {
        int i;
        while ((i = fis.read())!= -1) { //파일의 끝까지 읽기
            System.out.print((char) i);
        }
    } catch (IOException e) {
    }
}

Writer

  • 문자 단위 출력 스트림 최상위 추상 클래스

  • 주요 클래스

    • FileWriter
      파일에서 문자 단위로 출력하는 스트림 클래스입니다.
    • OutputStreamWriter
      바이트 단위의 자료를 문자로 변환해 출력해주는 보조 스트림 클래스 입니다.
    • BufferedWriter
      문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공하는 보조 스트림입니다.
  • 주요 메서드

    • int write(int c)
      한 문자를 파일에 합니다.
    • int write(char[] buf)
      문자 배열 buf의 내용을 출력합니다.
    • int write(char[] buf, int off, int len)
      문자 배열 buf의 off위치에서부터 len 개수의 문자를 출력합니다.
    • int write(String str)
      문자열 str을 출력합니다.
    • int write(String str, int off, int len)
      문자열 str의 off번째 문자로부터 len 개수만큼 출력합니다.
    • int flush()
      출력하기 전에 자료가 있는 공간(출력 버퍼)을 비워 출력하도록 합니다
    • void close()
      스트림과 연결된 리소스를 닫습니다. 출력 버퍼도 비워집니다.
  • 파일에 문자 쓰기

public class FileWriterTest {

	public static void main(String[] args) {

		try(FileWriter fw = new FileWriter("writer.txt")){
			fw.write('A');    // 문자 하나 출력
			char buf[] = {'B','C','D','E','F','G'};
			
			fw.write(buf); //문자 배열 출력
			fw.write("안녕하세요. 잘 써지네요"); //String 출력
			fw.write(buf, 1, 2); //문자 배열의 일부 출력
			fw.write("65");  //숫자를 그대로 출력
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("출력이 완료되었습니다.");
	}
}
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글