BE전문가 프로젝트

17. 입출력 스트림 본문

JAVA

17. 입출력 스트림

원호보고서 2023. 11. 23. 02:38

데이터는 스트(stream)을 통해 입력되거나 출력된다. 여기서 나오는 스트림이란 단일 방향으로 연속적으로 흘려가는 것을 의미한다.

키보드처럼 데이터가 프로그램에 도착하여 데이터를 입력받을 때는 입력 스트림을 사용하고, 반대로 모니터처럼 데이터가 프로그램으로 부터 출발하게 되면 출력 스트림을 사용해야한다.

 

구분 바이트 기반 스트림 문자 기반 스트림
그림, 멀티미디어 등의 바이너리 데이터 읽고 출력 문자 데이터 읽고 출력
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 XXXInputStream XXXOutputStream XXXReader XXXWriter

 

OutputStream(바이트 출력 스트림)

바이트 기반 출력 스트림의 최상위 클래스이며 추상 클래스이다. 

리턴 타입 메소드 설명
void write(int b) 1byte를 출력한다
(int는 4byte이다. 따라서 매개 변수로 주어지는 b는 전체가 보내지는 것이 아닌 끝 1byte만 출력 스트림으로 보내진다.)
void write(byte[] b) 매개값으로 주어진 배열 b의 모든 바이트를 출력한다.
void write(byte[] b, int off, int len) 매개값으로 주어진 배열 b의 off부터 len개까지 바이트를 출력한다.
void flush() 출력 버퍼에 잔류하는 모든 바이트를 출력한다.
void close() 출력 스트림을 닫는다.

 

public class HelloWorld {

    public static void main(String[] args) throws Exception {
		
        //예제 - write(int b)
        OutputStream os = new FileOutputStream("D:/workspace/Baekjoon/src/test1.db");

        byte a = 10;
        byte b = 20;
        byte c = 30;

        os.write(a);
        os.write(b);
        os.write(c);

        os.flush();
        os.close();

        //예제 - write(byte[] b)
        os = new FileOutputStream("D:/workspace/Baekjoon/src/test2.db");

        os.write(new byte[]{10, 20, 30});

        os.flush();
        os.close();

        //예제 - write(byte[] b, off, len)
        os = new FileOutputStream("D:/workspace/Baekjoon/src/test3.db");

        os.write(new byte[]{10, 20, 30}, 1, 2);

        os.flush();
        os.close();
    }
}

 

InputStream(바이트 입력 스트림)

바이트 기반 입력 스트림의 최상위 클래스이며 추상 클래스이다. 

리턴 타입 메소드 설명
int read() 1byte를 읽고 읽은 바이트를 리턴한다.
(1byte를 읽고 int타입으로 리턴한다. int는 4byte이다. 따라서 리턴된 4byte 중에 마지막 1byte에만 데이터가 들어있다.)
int read(byte[] b) 읽은 바이트를 매개값으로 주어진 배열에 저장하고 읽은 바이트 수를 리턴한다.
(배열의 길이만큼 데이터를 배열에 저장한다.
int read(byte[] b, int off, int len) len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off]부터 len개까지 저장한다.
void close() 입력 스트림을 닫는다.

 

더이상 읽을 데이터가 없다면 -1일 리턴한다.

public class HelloWorld {

    public static void main(String[] args) throws Exception {

        //예제 - read()
        InputStream is = new FileInputStream("D:/workspace/Baekjoon/src/test1.db");

        while (true) {
            int data = is.read();
            if(data == -1) break;
            System.out.println(data);
        }

        is.close();

        //예제 - read(byte[] b)
        is = new FileInputStream("D:/workspace/Baekjoon/src/test2.db");

        byte[] arr = new byte[100];

        int num = is.read(arr);

        System.out.println("바이트의 수 : " + num);

        for (int i = 0; i < num; i++) {
            System.out.println(arr[i]);
        }

        is.close();

    }
}

 

Writer(문자 출력 스트림)

문자 기반 출력 스트림의 최상위 클래스이며 추상 클래스이다. 

리턴 타입 메소드 설명
void write(int c) 매개값으로 주어진 한 문자를 보낸다.
(2byte를 읽고 int타입으로 리턴한다. int는 4byte이다. 따라서 리턴된 4byte 중에 마지막 2byte에만 데이터가 들어있다.)
void write(char[] c) 매개값으로 주어진 배열의 모든 문자를 보낸다.
void write(char[] c, int off, int len) 매개값으로 주어진 배열 c의 off부터 len개까지 문자를 보낸다.
void write(String str) 매개값으로 주어진 모든 문자열를 보낸다.
void write(String str, int off, int len) 매개값으로 주어진 문자열에서 off순번부터 len개까지의 문자를 보낸다.
void flush() 버퍼에 잔류하는 모든 문자를 출력한다.
void close() 출력 스트림을 닫는다.
public class HelloWorld {

    public static void main(String[] args) throws Exception {
        
        //예제 - write(int c)
        Writer wt = new FileWriter("D:/workspace/Baekjoon/src/test1.txt");
        wt.write('A');
        wt.write('B');
        wt.write('C');
        
        wt.flush();
        wt.close();
        
        
        //예제 - write(char[] c)        
        wt = new FileWriter("D:/workspace/Baekjoon/src/test2.txt");
        wt.write(new char[]{'A', 'B', 'C'});
    
        wt.flush();
        wt.close();


        //예제 - write(char[] arr, int off, int len)  
        wt = new FileWriter("D:/workspace/Baekjoon/src/test3.txt");
        wt.write(new char[]{'A', 'B', 'C'}, 1, 2);
 
        wt.flush();
        wt.close();


        //예제 - write(String str)  
        wt = new FileWriter("D:/workspace/Baekjoon/src/test4.txt");
        wt.write("안녕 내 이름은 자바");

        wt.flush();
        wt.close();

        //예제 - write(String str, int off, int len)  
        wt = new FileWriter("D:/workspace/Baekjoon/src/test5.txt");
        wt.write("안녕 내 이름은 자바", 0, 2);

        wt.flush();
        wt.close();
    }
}

 

 

Reader(문자 출력 스트림)

문자 기반 입력 스트림의 최상위 클래스이며 추상 클래스이다. 

리턴 타입 메소드 설명
int read(int c) 문자 1개를 읽고 리턴한다.
int read(char[] c) 매개값으읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자 수를 리턴한다.
int read(char[] c, int off, int len) len개의 문자를 읽고 매개값으로 주어진 문자 배열에서 c[off] 부터 len개까지 저장 후 읽은 문자 수를 리턴한다.
void close() 입력 스트림을 닫는다.

더이상 읽을 데이터가 없다면 -1일 리턴한다.

 

public class HelloWorld {

    public static void main(String[] args) throws Exception {
		
        //예제 - read()
        Reader reader = new FileReader("D:/workspace/Baekjoon/src/test1.txt");

        while (true) {
            int data = reader.read();
            if (data == -1) break;
            System.out.println((char) data);
        }

        reader.close();

        
        //예제 - read(char[] c)
        reader = new FileReader("D:/workspace/Baekjoon/src/test2.txt");

        char[] arr = new char[100];

        int num  = reader.read(arr);

        for (int i = 0; i < num; i++) {
            System.out.println((char) arr[i]);
        }
    }
}

 

'JAVA' 카테고리의 다른 글

18. 보조 스트림  (2) 2023.11.23
16-2 스레드 - 제어  (0) 2023.11.21
16-1. 스레드 - 멀티스레드  (2) 2023.11.20
15. java.lang에 대하여  (0) 2023.11.15
14. Object 클래스(hashcode() 및 equals())  (0) 2023.11.15
Comments