20201118_TIL
by Haebin Seo
오늘 한 일
- java 공부
- 자바 입출력
-
스트림이란
네트워크에서 자료의 흐름이 물과 같다는 의미에서 유래
다양한 입출력 장치에 독립적으로 일관성 있는 입출력을 제공하는 방식
입출력이 구현되는 곳: 파일 디스크, 키보드, 마우스, 메모리 네트워크 등 -
스트림의 구분
구분 기준 종류 대상 입력 스트림 / 출력 스트림 자료의 종류 바이트 스트림 / 문자 스트림 기능 기반 스트림 / 보조 스트림 -
입력 스트림과 출력 스트림
입력 스트림: 대상으로부터 자료를 읽어 들이는 스트림
ex) FileInputStream, FileReader, BufferedInputStream, BufferedReader 등출력 스트림: 대상으로 자료를 출력하는 스트림
ex) FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등 -
바이트 단위 스트림과 문자 단위 스트림
바이트 단위 스트림: 동영상, 음악 파일 등을 읽고 쓸 때 사용
ex) FileInputStream, FileOutputStream, BufferedInputStream, BufferedOutputStream 등문자 단위 스트림: 바이트 단위로 자료를 처리하면 문자는 깨지기 때문에 2 바이트 단위로 처리하도록 구현된 스트림
ex) FileReader, FileWriter, BufferedReader, BufferedWriter 등 -
기반 스트림과 보조 스트림
기반 스트림: 대상에 직접 자료를 읽고 쓰는 기능의 스트림
ex) FileInputStream, FileOutputStream, FileReader, FileWriter 등보조 스트림: 직접 읽고 쓰는 기능은 없이 추가적인 기능을 더해주는 스트림. 보조 스트림은 직접 읽고 쓰는 기능은 없으므로, 항상 기반 스트림이나 또 다른 보조 스트림을 생성자 매개변수로 포함한다.
ex) InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream 등 -
표준 입출력
System 클래스의 표준 입출력 멤버
- System.out
표준 출력(모니터) 스트림System.out.println("에러 메시지");
- System.in
표준 입력(키보드) 스트림
int d = System.in.read(); // 한 바이트 읽어내기
- System.err
표준 에러 출력(모니터) 스트림System.err.println("데이터");
- System.out
-
Scanner 클래스
java.util 패키지에 있는 입력 클래스로, 문자뿐 아니라 정수, 실수 등 다른 자료형도 읽을 수 있다. 콘솔, 파일 등의 여러 대상에서 자료를 읽을 수 있다.
System.in 클래스보다 Scanner 클래스를 더 많이 사용한다. System.in은 바이트 단위로 읽기 때문에 한글처럼 한 바이트씩 읽으면 안되는 경우 보조 스트림을 사용해야 한다.
생성자 설명 Scanner(File source) 파일을 매개변수로 받아 Scanner를 생성합니다. Scanner(InputStream source) 바이트 스트림을 매개변수로 받아 Scanner를 생성합니다. Scanner(String source) String을 매개변수로 받아 Scanner를 생성합니다. 메서드 설명 boolean nextBoolean() boolean 자료를 읽습니다. byte nextByte() 한 바이트 자료를 읽습니다. short nextShort() short 자료형을 읽습니다. int nextInt() int 자료형을 읽습니다. long nextLong() long 자료형을 읽습니다. float nextFloat() float 자료형을 읽습니다. double nextDouble() double 자료형을 읽습니다. String nextLine() 문자열 String을 읽습니다. -
Console 클래스
System.in을 사용하지 않고 콘솔에서 표준 입력을 할 수 있다. 이클립스와는 연동되지 않으며 command 창에서 입력한다.
메서드 설명 String readLine() 문자열을 읽습니다. char[] readPassword() 사용자에게 문자열을 보여주지 않고 읽습니다. Reader reader() Reader 클래스를 반환합니다. PrintWriter writer() PrintWriter 클래스를 반환합니다. -
바이트 단위 스트림 - InputStream / OutputStream
바이트 단위 입력용/출력용 최상위 스트림
추상 메서드를 포함한 추상 클래스로 하위 클래스가 구현하여 사용한다.-
InputStream의 주요 하위 클래스
스트림 클래스 설명 FileInputStream 파일에서 바이트 단위로 자료를 읽습니다. ByteArrayInputStream Byte 배열 메모리에서 바이트 단위로 자료를 읽습니다. FilterInputStream 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위클래스입니다. 메서드 설명 int read() 입력 스트림으로부터 한 바이트의 자료를 읽습니다. 읽은 값을 반환합니다. int read(byte b[]) 입력 스트림으로부터 b[] 크기의 자료를 b[]에 읽습니다. 읽은 자료의 바이트 수를 반환합니다. int read(byte b[], int off, int len) 입력 스트림으로부터 b[] 크기의 자료를 b[]의 off 변수 위치부터 저장하며 len만큼 읽습니다. 읽은 자료의 바이트 수를 반환합니다. void close() 입력 스트림과 연결된 대상 리소스를 닫습니다. (예: FileInputStream인 경우 파일 닫음) -
OutputStream의 주요 하위 클래스
스트림 클래스 설명 FileOutputStream 바이트 단위로 파일에 자료를 씁니다. ByteArrayOutputStream Byte 배열에 바이트 단위로 자료를 씁니다. FilterOutputStream 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위클래스입니다. FileOutputStream은 전달된 숫자의 ASCII 값에 해당하는 문자를 file에 작성한다. 만약 자료형을 보전하고 싶다면 DataOutputStream을 사용해야 한다.
FileOutputStream은 기본적으로 같은 이름의 파일이 존재하면 덮어쓰므로, 이어서 작성하기를 원하면 두 번째 인자로 true를 넣어서 생성하면 된다.메서드 설명 void write(int b) 한 바이트를 출력합니다. void write(byte b[]) b[] 배열에 있는 자료를 출력합니다. void write(byte b[], int off, int len) b[] 배열에 있는 자료의 off 위치부터 len만큼 자료를 출력합니다. void flush() 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력합니다. void close() 출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비워집니다. (예: FileOutputStream인 경우 파일 닫음) write() 메서드로 값을 썼다해도 바로 파일이나 네트워크로 전송되지 않고 출력 버퍼에 어느 정도 자료가 모여야 출력이 된다. 따라서 자료의 양이 출력할 만큼 많지 않으면 write() 메서드로 출력했어도 파일에 쓰이지 않거나 전송되지 않았을 수 있다. 이 때 flush() 메서드를 호출하면 출력 버퍼가 강제로 비워지면서 남아 있는 자료가 모두 출력된다.
-
-
문자 단위 스트림 - Reader / Writer
문자 단위로 읽는/쓰는 최상위 스트림
하위 클래스에서 상속 받아 구현한다.-
Reader의 주요 하위 클래스 및 메서드
스트림 클래스 설명 FileReader 파일에서 문자 단위로 읽는 스트림 클래스입니다. InputStreamReader 바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 클래스입니다. BufferedReader 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공해주는 보조 스트림입니다. 메서드 설명 int read() 파일으로부터 한 문자를 읽습니다. 읽은 값을 반환합니다. int read(char buf[]) 파일로부터 buf[] 배열에 문자를 읽습니다. int read(char buf[], int off, int len) 파일로부터 buf[] 배열의 off 위치부터 len 개수만큼 문자를 읽습니다. void close() 스트림과 연결된 파일 리소스를 닫습니다.
-
Writer의 주요 하위 클래스 및 메서드
스트림 클래스 설명 FileWriter 파일에서 문자 단위로 출력하는 스트림 클래스입니다. OutputStreamWriter 파일에 바이트 단위로 출력한 자료를 문자로 변환해주는 보조 스트림 클래스입니다. BufferedWriter 문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공해주는 보조 스트림입니다. 메서드 설명 void write(int c) 한 문자를 파일에 출력합니다. void write(char buf[]) 문자 배열 buf[]의 내용을 파일에 출력합니다. void write(char buf[], int off, int len) 문자 배열 buf[]의 off 위치부터 len 개수만큼의 문자를 파일에 출력합니다. void write(String str) 문자열 str을 파일에 출력합니다. void write(String str, int off, int len) 문자열 str의 off 위치부터 len 개수만큼의 파일에 출력합니다. void flush() 파일에 출력하기 전에 자료가 있는 공간(출력 버퍼)을 비워 출력합니다. void close() 파일과 연결된 스트림을 닫습니다. 출력 버퍼도 비워집니다.
-
-
보조 스트림
실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림으로 wrapper stream으로 소개되기도 한다. 데코레이터 패턴이 적용되었다. FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스이고, 생성자의 매개 변수로 또 다른 스트림을 가진다.
생성자 설명 protected FilterInputStream(InputStream in) 생성자의 매개변수로 inputStream을 받습니다. public FilterOutputStream(OutputStream out) 생성자의 매개변수로 OutputStream을 받습니다. -
InputStreamReader와 OutputStreamWriter
바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림으로, FileInputStream(바이트 스트림)으로 읽은 자료를 문자로 변환하는 것을 예로 들 수 있다.만약 자료의 크기가 매우 크다면 Buffered stream을 사용해 속도를 빠르게 할 수 있다.
-
Buffered Stream
내부적으로 8192 바이트 배열을 가지고 읽거나 쓰기 기능을 제공하여 속도가 빠르다.스트림 클래스 설명 BufferedInputStream 바이트 단위로 읽는 스트림에 버퍼링 기능을 제공합니다. BufferedOutputStream 바이트 단위로 출력하는 스트림에 버퍼링 기능을 제공합니다. BufferedReader 문자 단위로 읽는 스트림에 버퍼링 기능을 제공합니다. BufferedWriter 문자 단위로 출력하는 스트림에 버퍼링 기능을 제공합니다. 또한 BufferedReader는 한번에 한 줄씩 읽는 readLine() 메서드를 제공하므로 편리하다.
-
DataInputStream과 DataOutputStream
자료가 메모리에 저장된 0, 1 상태 그대로 읽거나 쓰는 스트림-
읽는 메서드
메서드 설명 byte readByte() 1바이트를 읽어 반환합니다. boolean readBoolean() 읽은 자료가 0이 아니면 true를, 0이면 false를 반환합니다. char readChar() 한 문자를 읽어 반환합니다. short readShort() 2바이트를 읽어 정수 값을 반환합니다. int readInt() 4바이트를 읽어 정수 값을 반환합니다. long readLong() 8바이트를 읽어 정수 값을 반환합니다. float readFloat() 4바이트를 읽어 실수 값을 반환합니다. double readDouble() 8바이트를 읽어 실수 값을 반환합니다. String readUTF() 수정된 UTF-8 인코딩 기반으로 문자열을 읽어 반환합니다.
-
쓰는 메서드
메서드 설명 void writeByte(int v) 1바이트를 읽어 반환합니다. void writeBoolean(boolean v) 읽은 자료가 0이 아니면 true를, 0이면 false를 반환합니다. void writeChar(int v) 한 문자를 읽어 반환합니다. void writeShort(int v) 2바이트를 읽어 정수 값을 반환합니다. void writeInt(int v) 4바이트를 읽어 정수 값을 반환합니다. void writeLong(long v) 8바이트를 읽어 정수 값을 반환합니다. void writeFloat(float v) 4바이트를 읽어 실수 값을 반환합니다. void writeDouble(double v) 8바이트를 읽어 실수 값을 반환합니다. void writeUTF(String str) 수정된 UTF-8 인코딩 기반으로 문자열을 읽어 반환합니다.
-
-
직렬화 (serialization)
인스턴스의 상태를 그대로 저장하거나(serialization) 다시 복원하는(deserialization) 방식으로, 파일에 쓰거나 네트워크로 전송하는데 쓰인다. 직렬화를 하고자 하는 클래스는 Serializable 표시 인터페이스(marker interface)를 상속받아야 한다.
ObjectInputStream과 ObjectOutputStream을 사용한다.생성자 설명 ObjectInputStream(InputStream in) InputStream을 생성자의 매개변수로 받아 ObjectInputStream을 생성합니다. ObjectOutputStream(OutputStream out) OutputStream을 생성자의 매개변수로 받아 ObjectOutputStream 생성합니다. transient 예약어를 사용하면 해당 변수는 직렬화되지 않는다. 따라서 직렬화를 원치 않는 정보나 직렬화가 불가능한(ex. Socket) 경우에 transient를 사용한다.
transient String title;
만약 직렬화 되는 방식을 직접 정하고 싶다면 Externalizable 인터페이스를 구현하면 된다.
Serializable과는 달리 writeExternal(ObjectOutput out)과 readExternal(ObjectInput in) 메서드를 구현해야 하며, 직렬화와 복원시 해당 메서드가 호출된다. 저장하는 순서와 읽는 순서는 동일해야 한다. -
그 외 입출력 클래스
-
File 클래스
파일 개념을 추상화한 클래스로, 입출력 기능은 없고 파일의 속성, 경로, 이름 등을 알 수 있다. -
RandomAccessFile 클래스
입출력 클래스 중 유일하게 파일 입출력을 동시에 할 수 있는 클래스이다. 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능하다. 다양한 자료형에 대한 메서드가 제공된다.
-
-
-
- 자바 입출력
- Java의 length, length(), size() 사용법
- length: 배열(arrays)의 길이를 알고자 할때 사용된다. ex) int[], double[], String[], etc.
- length(): 문자열(String related Object)의 길이를 알고자 할때 사용된다. ex) String, StringBuilder, etc.
- size(): 컬렉션 프레임워크 타입의 길이를 알고자 할때 사용된다. ex) ArrayList, Set, etc.
참조
- Do it! 자바 프로그래밍 입문: https://www.inflearn.com/course/자바-프로그래밍-입문/dashboard
- Java의 length, length(), size() 사용법: https://mine-it-record.tistory.com/126
Subscribe via RSS