스트림이란?
- 네트워크에서 자료의 흐름이 물과 같다는 의미에서 유래
- 다양한 입출력 장치에 독립적으로 일관성 있는 입출력을 제공하는 방식
- 입출력이 구현되는 곳 : 파일디스크, 키보드, 마우스, 메모리, 네트워크 등
- 예외처리 필요
스트림의 구분
대상 기준
- 입력 스트림 / 출력 스트림
자료의 종류
- 바이트 스트림 / 문자 스트림
기능
- 기반 스트림 / 보조 스트림
입력 스트림과 출력 스트림
- 입력 스트림 : 대상으로 부터 자료를 읽어들이는스트림
- 출력 스트림 : 대상으로 자료를 출력하는 스트림
- 입, 출력 스트림을 동시에 하지 않는다.
- 스트림의 종류
종류 | 예시 |
입력 스트림 | FileInputStream, FileReader, BufferedInputStream, BufferedReader 등 |
출력 스트림 | FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등 |
바이트 단위 스트림과 문자 단위 스트림
- 바이트 단위 스트림 : 동영상, 음악 파일 등을 읽고 쓸 때 사용
- 문자 단위 스트림 : 바이트 단위로 자료를 처리하면 문자는 깨짐 2바이트 단위로 처리하도록 구현된 스트림
- 스트림의 종류
기반 스트림과 보조 스트림
- 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
- 보조 스트림 : 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림
- 보조 스트림은 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자 매개변수로 포함 한다.
표준 입출력
- 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
Scanner 클래스
- 많이 씀
- java.util 패키지에 있는 입력 클래스
- 문자 뿐 아니라 정수, 실수 등 다른 자료형도 읽을 수 있음
- 여러 대상에서 자료를 읽을 수 있음 ( 콘솔, 파일 등 )
- 생성자
생성자 | 설명 |
Scanner(File source) | 파일을 매개변수로 받아 Scanner을 생성 |
Scanner(InputStream source) | 바이트 스트림을 매개변수로 받아 Scanner를 생성 |
Scanner(String source) | String을 매개변수로 받아 Scanner를 생성 |
- 메서드
Console 클래스
- System.in을 사용하지 않고 콘솔에서 표준 입력을 할 수 있음
- 이클립스와 연동되지 않음
- command 창에서 입력
- 메서드
바이트 단위 스트림 - InputStream
- 바이트 단위 입력용 최상위 스트림
- 추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용
- 주요 하위 클래스
스트림 클래스 | 설명 |
FileInputStream | 파일에서 바이트 단위로 자료를 읽는다. |
ByteArrayInputStream | Byte 배열 메모리에서 바이트 단위로 자료를 읽는다. |
FilterInputStream | 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
- 메서드
바이트 단위 스트림 - OutputStream
- 바이트 단위 출력용 최상위 스트림
- 추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용
- 주요 하위클래스
스트림 클래스 | 설명 |
FileOutputStream | 바이트 단위로 파일에 자료를 쓴다 |
ByteArrayOutputStream | Byte 배열에 바이트 단위로 자료를 쓴다 |
FilterOutputStream | 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
- 메서드
flush()와 close() 메서드
- 출력 버퍼를 비울 때 flush() 메서드 사용
- close() 매서드 내부에서 flush()가 호출되므로 close() 메소드가 호출되면 출력 버퍼가 비워짐
문자 단위 스트림 - Reader
- 문자 단위로 읽는 최상위 스트림
- 하위 클래스에서 상속 받아 구현
스트림 클래스 | 설명 |
FileReader | 파일에서 문자 단위로 읽는 스트림 클래스 |
InputStreamReader | 바이트 단위로 읽은 자료를 문자로 변환해 주는 보조 스트림 클래스 |
BufferedReader | 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공해주는 보조스트림 |
- 주요 메서드
보조 스트림
- 실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림
- 데코레이터 패턴
- FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스
- 생성자의 매개 변수로 또 다른 스트림을 가짐
생성자 | 설명 |
protected FilterInputStream(InpuStream in) | 생성자의 매개변수로 InputStream을 받는다 |
public FilterOutputStream(OutputStream out) | 생성자의 매개변수로 OutputStream을 받는다. |
InputStreamReader와 OutputStreamWriter
- 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림
1. FileInputStream(바이트 스트림)으로 읽은 자료를 문자로 변환하는 예
- FileInputStream 을 통해 파일을 읽어오는 문자가 다 깨져서 나오게 된다.
- InputStreamReader 에 FileinputStream을 감싸서 생성 -> 정상
2. FileInputStream(바이트 스트림)으로 읽은 파일을 FileOutputStream(바이트 스트림)으로 쓰는 예
- 매우 느림
Buffered 스트림
- 내부적으로 8192 바이트 배열을 가지고 읽거나 쓰기 기능을 재공하여 속도가 빨라짐
- 버퍼 사용 결과 ( 빨라짐 ! )
3. 소켓 프로그래밍의 예
public class SocketTest {
public static void main(String[] args) {
Socket socket = new Socket();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//보조스트림(보조스트림(기반스트림))
br.readLine();
} catch (IOException e) {
System.out.println(e);
}
}
}
4. 자료형에 기반하여 파일을 쓰고 읽는 예
- DataInputStream, DataOutputStream 보조스트림 사용
- 파일 내에서는 깨져서 보이지만 읽어들일 때 형에 맞춰서 정상적으로 가져옴
DataInputStream과 DataOutputStream
- 자료가 메모리에 저장된 0,1 상태 그대로 읽거나 쓰는 스트림
직렬화 (Serialization)
- 인스턴스의 상태를 그대로 저장하거나 (serialization) 다시 복원하는 (deserialization) 방식
- 파일에 쓰거나 네트워크로 전송
- ObjectInputStream과 ObjectOutputStream 사용
- 직렬화할 대상 클래스에 implements Serializable 을 해주어야 한다.
- 직렬화 대상에서 빼려면 앞에 transient를 선언한다. (ex. transient String title;)
Serializable 인터페이스
- 직렬화는 인스턴스 내용이 외부로 유출되는 것이므로 프로그래머가 직렬화 의도를 표시해야 함
class Person implements Serializable {
...
String name;
String title;
...
}
Externalizable 인터페이스
- 프로그래머가 자료를 읽고 쓰는 방식을 직접 구현 함
그 외 입출력 클래스
File 클래스
- 파일개념을 추상화한 클래스
- 입출력 기능은 없고 파일의 속성, 경로, 이름 등을 알 수 있음
RandomAccessFile 클래스
- 입출력 클래스 중 유일하게 파일 입출력을 동시에 할 수 있는 클래스
- 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능
- 다양한 자료형에 대한 메서드가 제공됨
'Back-end > java' 카테고리의 다른 글
스터디 2주차 - 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.06.28 |
---|---|
스터디 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2021.06.24 |
예외 처리 (0) | 2021.06.24 |
스트림 (0) | 2021.06.23 |
람다식 (0) | 2021.06.23 |