course 2021/JAVA

day20 - API(3) stream

코딩하는토끼 2021. 9. 26. 01:38

> java.io 패키지

> 스트림 stream

데이터의 흐름(통로)

입력 스트림: 데이터가 들어옴  /  출력 스트림: 데이터가 나감

 

- 스트림 클래스 종류 두가지 -

1. byte 기반 스트림: <1byte 단위> 그림, 문자 등 모든 종류의 데이터 보낼 수 있음 - 이미지, 동영상 등의  데이터에 주로 사용

2. 문자 기반 스트림: <2byte 단위> 오직 문자만 보낼 수 있음 - 문자열에 주로 사용

1. byte 기반 스트림

모든 바이트 기반 스트림은 바이트 기반 최상위 클래스(입력 스트림 InputStream, 출력 스트림 OutputStream)를 상속받아 만들어짐

이 때, 하위 클래스는 접미사로 각각 InputStream/OutputStream 을 붙임

ex. FileInputStream, FileOutputStream

- OutputStream

바이트 기반 출력 스트림의 최상위 클래스

추상클래스

- 주요 메소드 -

1) write(byte b): 출력 스트림으로 1바이트를 내보냄

2) write(byte[] b): 출력 스트림으로 주어진 바이트 배열 b의 모든 바이트들을 내보냄

→ byte 단위로 쓰는 OutputStream

Scannr scan = new Scanner(System.in);

System.out.print("파일명 입력>");
String name = scan.next();

OutputStream fos = null;

try { 
    //FileOutputStream(파일을 쓸 경로)
    fos = new FileOutputStream("C:\\Users\\ ~ \\" + name + ".txt");
    
    System.out.print("문장 입력>");
    scan.nextLine();
    String str = scan.nextLine();
    
    byte[] bs = str.getBytes();
    
    fos.write(bs);
    System.out.println("파일이 정상적으로 저장됨");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try { 
        fos.close();
        scan.close();
    } catch (Exception e2) { 
        e2.printStackTrace();
    }
}

- InputStream

바이트 기반 입력 스트림의 최상위 클래스

추상클래스

InputStream 추상 클래스를 이용해 객체 생성, 하위 클래스로 구현 (한글은 2바이트이므로 깨지는 현상 있음)

- 주요 메소드 -

1) read(): 입력 스트림으로부터 1바이트를 읽고, 읽은 바이트 반환

2) read(byte[] b): 입력 스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열에 저장하고, 실제로 읽은 바이트 수 반환

3) close(): 스트림을 더이상 사용하지 않을 경우 사용한 시스템 자원을 풀어줌

→ byte 단위로 읽는 InputStream

InputStream fis = null;

try { 
    //FileInputStream(읽을 파일의 경로)
    fis = new FileInputStream("C:\\Users\\ ~ .txt");
    while(true) {
        int data = fis.read();
        System.out.print((char)data);
        
        if(data == -1) break;
    }
} catch (FileNotFoundException e) {
    System.out.println("해당 경로의 파일을 찾을 수 없음");
} catch (IOException e) {
    System.out.println("파일을 읽을 수 없음");
} finally { 
    try { 
        fis.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

2. 문자 기반 스트림

바이트 기반 스트림에서 한글(2byte)이 깨지는 문제점을 보완 → 문자/문자열을 다룰 때 유니코드 방식 제공

입력 클래스 Reader, 출력 클래스 Writer

이 입출력 클래스를 사용하면 자동으로 바이트가 유니코드화 됨 (2바이트 문자도 정상 처리)

ex. FileReader, FileWriter

- Writer

텍스트 파일을 프로그램으로 쓸 때 사용하는 문자 기반 스트림

추상 클래스

클래스의 객체 생성, 하위 클래스로 구현

주요 메소드 - OutputStream 클래스와 거의 동일

- Reader

텍스트 파일을 프로그램으로 읽을 때 사용하는 문자 기반 스트림

문자 단위로 읽고 씀 (텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽거나 쓸 수 없음)

추상클래스

클래스의 객체 생성, 하위 클래스로 구현

주요 메소드 - InputStream 클래스와 거의 동일

 

3. 입출력 성능 향상 보조 스트림

- BufferedWriter

텍스트 파일을 프로그램으로 쓸 때 (출력) 사용하는 문자 기반 스트림

데이터를 읽어 버퍼에 저장한 후 한번에 쓰는 형태로 사용됨, 속도가 빠름

생성자의 매개변수로 (문자 출력 스트림 클래스)를 전달

Write rt = new FileWriter("쓸 파일의 경로");
BufferedWriter bw = new BufferedWriter(rt);  //생성자의 매개변수에 rt 전달

- 주요 메소드 -

writer 클래스와 거의 동일

flush(): 버퍼를 비움

주의: 버퍼가 가득 찼을 때만 출력 → flush()를 호출하여 잔류하는 데이터를 모두 보내야 함

- BufferedReader

텍스트 파일을 프로그램으로 읽을 때 (입력) 사용하는 문자 기반 스트림

데이터를 읽어 버퍼에 저장한 후 한번에 읽는 형태로 사용됨, 속도가 빠름

생성자의 매개변수로 (문자 입력 스트림 클래스)를 전달

Reader rd = new FileReader("읽을 파일의 경로");
BufferedReader bf = new BufferedReader(rd);  //생성자의 매개변수에 rd 전달

- 주요 메소드 -

Reader 클래스와 거의 동일

readLine(): 한 줄을 한번에 읽어들임

try{ 
    Reader rd = new FileReader("읽을 파일의 경로");
    BufferedReader bf = new BufferedReader(rd);
    
    String str = "";
    while((str = bf.readLine()) != null) {
        System.out.println(str);
    }
} catch (Exception e) { 
    e.printStackTrace();
}