일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- extends
- lambda
- down casting
- parameter group
- Inbound
- public static final
- Stream
- constructor
- 스트림
- Up Casting
- 파이참
- 셔뱅
- 깊은 복사
- generic programming
- node.js
- singletone
- Java
- access modifier
- shebang
- pycharm
- arraycopy
- 자바
- identityHashCode
- 얕은 복사
- finalize
- Wrapper class
- 내부클래스
- 엔드포인트
- has-a
- dbeaver
- Today
- Total
٩(๑•̀o•́๑)و
20200311,20200315 - 자바 입출력 스트림 본문
입출력 스트림
- 네트워크에서 자료의 흐름이 물과 같다는 의미에서 유래
- 다양한 입출력 장치에 독립적으로 일관성 있는 입출력 방식 제공
- 입출력이 구현되는 곳에서는 모두 I/O 스트림을 사용 : 키보드, 파일 디스크, 메모리 등
입출력 스트림 구분
- I/O 대상 기준 : 입력 스트림, 출력 스트림 - 입출력을 동시에 할 순 없음
- 자료의 종류 : 바이트 스트림, 문자 스트림
- 스트림의 기능 : 기반 스트림, 보조 스트림 - 데코레이터 패턴과 관련. 보조 스트림은 읽거나 쓰는 기능이 없음. 기반스트림만 읽고쓰기가 가능. 보조스트림은 기반스트림에 서포트기능을 추가함(버퍼링기능제공, 바이트를 문자로 변환, 직렬화 등)
입력 스트림 & 출력 스트림
- 입력 스트림 : 대상으로부터 자료를 읽어 들이는 스트림 (입출력 자료->자바응용프로그램)
- 입력 스트림 예시 - FileInputStream(바이트단위로 읽어들이는 스트림), FileReader(문자단위로 읽어들이는 스트림), BufferedInputStream(바이트 단위로 읽을때 버퍼링 기능을 제공해주는 보조스트림) , BufferedReader(문자 단위로 읽을때 버퍼링기능을 제공해주는 보조스트림) 등
- 출력 스트림 : 대상으로 자료를 출력하는 스트림 (자바응용프로그램->입출력자료)
- 출력 스트림 예시 - FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등
- Stream이 붙은건 바이트단위, Reader/Writer가 붙은건 문자.
바이트 단위 스트림 & 문자 단위 스트림
- 바이트 단위 스트림 : 바이트 단위로 자료를 읽고 씀(동영상, 음악파일 등)
- 바이트 단위 스트림 예시 : FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream 등
- 문자 단위 스트림 : 문자는 2바이트씩 처리해야함.
- 문자 단위 스트림 예시 : FileReader(목적지가 File로 명시 - 기반스트림), FileWriter(목적지가 File로 명시 - 기반스트림), BufferedFileReader(Buffered 기능 제공 - 보조스트림), BufferedFileWriter(Buffered 기능 제공 - 보조스트림) 등
기반 스트림 & 보조 스트림
- 기반 스트림 : 대상에 직접 자료를 읽고 쓰는 기능의 스트림
- 기반 스트림 예시 : FileInputStream, FileOutputStream, FileReader, FileWriter 등 -> 앞이 File로 되어있는 스트림
- 보조 스트림 : 직접 읽고 쓰는 기능은 없고 추가적인 기능을 제공해주는 스트림. 기반 스트림이나 또 다른 보조 스트림을 생성자의 매개변수로 포함함 -> 기반스트림 + 보조스트림 A + 보조스트림 B : 데코레이터 패턴 -> 상속보다 더 유연하게 기능을 확장할 수 있는 패턴
- 보조 스트림 예시 : InputStreamReader(바이트단위를 문자단위로 바꿔서 읽어들임), OutputStreamWriter(바이트단위를 문자단위로 바꿔서 씀), BufferedInputStream, BufferedOutputStream 등 -> 앞이 File외의 나머지 스트림들
표준 입출력
- System 클래스의 표준 입출력 멤버
public class System{
public static PrintStream out; //표준 출력 스트림
public static InputStream in; //표준 입력 스트림
public static PrintStream err; //표준 에러 스트림
}
System.in
- 한 바이트씩 읽어들임 - InputStream이기때문
- 한글과 같은 여러 바이트로 된 문자를 읽기 위해서는 InputStreamReader와 같은 보조 스트림을 사용해야함
- 표준 I/O는 계속 열려있음 - close하지 않는다.
InputStream.read() : 한 바이트를 읽음. 하지만 반환값이 int 즉 4바이트. End of Stream일때 -1이 반환되는데 이를 처리하기 위함. 읽는건 1바이트이지만 처리는 4바이트로 된다는 의미!
Scanner 클래스
- java.util 패키지에 있는 입력 클래스
- 문자뿐 아니라 정수, 실수 등 다양한 자료형을 읽을 수 잇음
- 생성자가 다양하여 여러 소스로부터 자료를 읽을 수 있음
- Scanner(File source) : 파일을 매개변수로 받아 Scanner를 생성
- Scanner(InputStream source) : 바이트 스트림을 매개변수로 받아 Scanner를 생성
- Scanner(String source) : String을 매개변수로 받아 Scanner를 생성
Console 클래스
- System.in을 사용하지 않고 콘솔에서 표준 입출력이 가능
- 이클립스와는 연동되지 않음
- String getLine() : 문자열을 읽음
- char[] readPassword() : 사용자에게 문자열을 보여주지 않고 읽음
- Reader reader() : Reader 클래스를 반환
- PrintWriter writer() : PrintWriter 클래스를 반환
바이트 단위 스트림
- InputStream : 바이트 단위 입력 스트림 최상위 클래스
- OutputStream : 바이트 단위 출력 스트림 최상위 클래스
- 추상 메서드를 포함한 추상클래스로 하위 클래스가 구현하여 사용
InputStream 의 주요 하위 클래스
스트림 클래스 | desc |
FileInputStream | 파일에서 바이트 단위로 자료를 읽음 |
ByteArrayInputStream | Byte 배열 메모리에서 바이트 단위로 자료를 읽음 |
FilterInputStream | 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조스트림의 상위 클래스 |
OutputStream 의 주요 하위 클래스
스트림 클래스 | desc |
FileOutputStream | 바이트 단위로 파일에 자료를 씀 |
ByteArrayOutputStream | Byte 배열에 바이트 단위로 자료를 씀 |
FileOutputStream | 기반 스트림에서 자료를 쓸 때 추가기능을 제공하는 보조 스트림의 상위 클래스 |
FileInputStream & FileOutputStream
- 파일에 한 바이트씩 자료를 읽고 쓰는데 사용 - 한글과 같이 multi byte문자는 불가!
- 입력 스트림은 파일이 없는 경우 예외 발생 - FileNotFoundException
- 입력 스트림에서 읽을 때 발생하는 예외는 IOException - FileNotFoundException의 상위 클래스.
- 출력 스트림은 파일이 없는 경우 파일을 생성하여 출력
문자 단위 스트림
- Reader : 문자 단위로 읽는 최상위 스트림
- Writer : 문자 단위로 쓰는 최상위 스트림
- 추상 메서드를 포함한 추상 클래스로 하위 클래스가 상속받아 구현
Reader 의 주요 하위 클래스
스트림 클래스 | desc |
FileReader | 파일에서 문자 단위로 읽는 스트림 클래스 |
InputStreamReader | 바이트 단위로 읽은 자료를 문자 단위로 변환해주는 보조 스트림 클래스. 소켓의 경우 무조건 Byte로 읽기때문에 이걸 사용해서 문자로 바꿔주면됨 |
BufferedReader | 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공 해주는 보조 스트림. 내부에 8k 정도의 버퍼를 갖고있음. 속도가 굉장히 빨라짐. |
Writer 의 주요 하위 클래스
스트림 클래스 | desc |
FileWriter | 파일에 문자 단위로 출력하는 스트림 클래스 |
OutputStreamWriter | 파일에 바이트 단위로 출력한 자료를 문자로 변환해주는 보조 스트림 |
BufferedWriter | 문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공해주는 보조 스트림 |
FileReader & FileWriter
- 파일에 문자를 읽고 쓸 때 가장 많이 사용하는 클래스
- 문자의 인코딩 방식을 지정할 수 있음
보조스트림
- 실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림
- FileInputStream 과 FileOutputStream 이 보조스트림의 상위 클래스
- 생성자의 매개변수로 또 다른 스트림을 가짐
- 보조스트림은 또다른 보조스트림을 감쌀 수 있다.
- 데코레이터 라고 함.
생성자 | desc |
protected FilterInputStream(InputStream in) | 생성자의 매개변수로 InputStream을 받음 |
protected FilterOutputStream(OutputStream out) | 생성자의 매개변수로 OutputStream을 받음 |
데코레이더 패턴(Decorator Pattern) : 기반스트림에 보조스트림을 이용하여 기능을 추가해나가는 디자인 패턴. 보조스트림을 계속 추가하면서 기능을 덧붙여나감
Buffered 스트림 : 내부에 8192 바이트 배열을 가지고 잇음. 읽거나 쓸 때 속도가 빠름
DataInputStream / DataOutputStream : 자료가 저장된 상태 그대로 자료형을 유지하며 읽거나 쓰는 기능을 제공하는 스트림
직렬화(Serialization)
- 인스턴스의 상태를 그대로 저장하거나 네트워크로 전송하고 이를 다시 복원(Deserialization)하는 방식
- ObjectInputStream과 ObjectOutputStream 사용하여 구현
- 보조스트림
Serializable 인터페이스
- 직렬화는 인스턴스의 내용이 외부(파일,네트워크)로 유출되는 것이므로 프로그래머가 객체의 직렬화 가능 여부를 명시함
- 구현 코드가 없는 mark interface
- transient : 직렬화 대상에서 제외할 경우 사용
class Person implements Serializable{ //직렬화하겠다는 의도를 표시
}
Externalizable 인터페이스
- Serializable 인터페이스의 확장
- writeExternal, readExternal 메서드를 직접 구현 - 읽고쓰는 것을 직접 구현하여 컨트롤 가능
File 클래스
- 파일 개념을 추상화한 클래스
- 입출력 기능은 없고 파일의 속성, 경로, 이름 등을 알 수 있음
RamdomAccessFile 클래스
- 입출력 클래스 중 유일하게 파일 입출력을 동시에 할 수 잇는 클래스
- 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능함 - seek 메서드 이용
- public void seek(long pos) : Sets the file-pointer offset, measured from the begining of this file, at which the next read or write occurs. The offset may be set beyond the end of the file. Setting the offset beyond the end of the file does not change the file length. The file length will change only by writing after the offset has been set beyong the end of the file.
- 다양한 자료형에 대한 메서드가 제공됨
- DataInput, DataOutput을 구현 - DataInputStream , DataOutputStream에 기반함.
데코레이터 패턴(Decorator Pattern)
- 자바의 입출력 스트림은 데코레이터 패턴을 사용
- 실제 입출력 기능을 가진 객체(컴포넌트, 기반클래스)와 그 외 다양한 기능을 제공하는 데코레이터(보조스트림)을 사용하여 다양한 입출력 기능을 구현
- 상속보다 유연한 확장성을 가짐
- 지속적인 서비스의 증가와 제거가 용이함
- 데코레이터는 항상 다른 컴포넌트를 내부적으로 가지고있음. 그 컴포넌트는 다른 데코레이터일 수도 있고, 기반클래스일 수도 있음. 데코레이터 자체로는 읽고쓰는것이 불가.
'Java' 카테고리의 다른 글
20200316 - Thread (0) | 2020.03.17 |
---|---|
20200311 - 예외와 예외처리 (0) | 2020.03.11 |
20200309, 20200310 - 내부 클래스, 람다식, 스트림 (0) | 2020.03.11 |
20200308 - 컬렉션 프레임워크 (0) | 2020.03.09 |
20200308 - Generic 프로그래밍 (0) | 2020.03.08 |