입출력(IO)
IO 란
Input과 Output의 약자, 컴퓨터 내부 또는 외부 장치와 프로그램이 데이터를 주고 받는 것이다
입출력 데이터를 처리할 공통적인 방법으로 스트림을 이용한다
스트림
[ 특징 ]
- FIFO 구조
- 선입선출 구조라고도 하며 먼저 들어간 데이터가 먼저 나오는 형태를 말한다
=> 데이터의 순서가 바뀌지 않는다
- 선입선출 구조라고도 하며 먼저 들어간 데이터가 먼저 나오는 형태를 말한다
- 단방향
- 하나의 스트림에서 입출력이 동시에 이루어지지 않는다
- 입력과 출력에 각각 스트림을 열어 사용해야 한다
- 지연 가능
- 스트림 내의 데이터가 모두 전송되기 전까지 프로그램이 지연상태에 빠질 수 있다
[ 스트림의 분류 ]
-
용도에 의한 분류
- 기반(1차) 스트림 : 디바이스에 직접 연결되는 스트림
- 보조(2차) 스트림 : 기반 스트림과 연결을 통해 디바이스에 연결되는 스트림
- 스트림의 기능을 향상시키거나 새로운 기능을 추가시킨다
=> 속도향상, 자료형변환, 객체단위의 입출력 보조 등 - 말그대로 보조적인 역할이며 단독으로 사용 불가하다
=> 꼭 기반 스트림과 함께 사용해야 한다
- 스트림의 기능을 향상시키거나 새로운 기능을 추가시킨다
-
전송 방향에 의한 분류
- 입력 스트림 : 디바이스로부터 데이터를 읽어오는 스트림 (input / read)
- 출력 스트림 : 디바이스로 데이터를 출력하는 스트림 (output / write)
-
전송 단위에 의한 분류
File 클래스
파일이나 디텍터리를 추상화한 클래스로 가장 많이 사용되는 입출력 대상 클래스이다
[ File 클래스의 생성자와 메소드 ]
File file = new File("파일 경로");
File file = new File("C:/data/test.txt");
-
생성자
생성자 설명 File(String fileName) 주어진 파일 이름을 가지는 객체 생성 File(String pathname, String fileName)
File(File pathname, String fileName)파일의 경로와 이름을 따로 지정하여 객체 생성 File(URI uri) 지정된 uri로 파일 생성 -
메소드
메소드 | 설명 |
---|---|
String getName() | 파일 이름을 String으로 반환 |
String getPath() | 파일의 경로를 String으로 반환 |
String getAbsolutePath() File getAbsoluteFile() |
파일의 절대결로를 String으로 반환 파일의 절대결로를 File로 반환 |
String getParent() File getParentFile() |
파일의 조상 디렉토리를 String으로 반환 파일의 조상 디렉토리를 File로 반환 |
String getCanonicalPath() File getCanonicalFile() |
파일의 정규경로를 String으로 반환 파일의 정규경로를 File로 반환 |
boolean isDirectory() | 설정한 경로가 있는지 확인 |
boolean createNewFile() | 새로운 파일을 생성 |
boolean mkdir() | 새로운 디렉토리 생성 |
boolean mkdirs() | 경로 상에 없는 모든 디렉토리 생성 |
boolean delete() | 파일 또는 디렉토리 삭제 |
바이트 스트림
- 바이트 단위(1byte)로 데이터를 전송
- 바이트 단위로 구성된 파일(동영상, 이미지, 음악 등)을 처리하기에 적합한 스트림
- 바이트 스트림의 최상위 클래스는 InputStream 과 OutputStream 이다
-
자손 클래스들은 입출력에 필요한 추상 메소드를 자신에 맞게 구현해 놓았다
-
입출력 대상에 따른 바이트 스트림 종류
입력스트림 출력스트림 입출력 대상 FileInputStream FileOutputStream 파일 ByteArrayInputStream ByteArrayOutputStream 메모리(byte배열) PipedInputStream PipedOutputStream 프로세스(프로세스 간 통신) AudioInputStream AudioOutputStream 오디오장치
[ InputStream 과 OutputStream ]
바이트 스트림의 최상위 클래스로써 둘 모두 추상 클래스이다
- InputStream
메소드 | 설명 |
---|---|
void close() | 사용한 시스템 자원 반납 후 입력 스트림을 닫음 |
abstract int read() | 스트림에서 1바이트를 읽음(0~255 아스키코드 값) 더 이상 읽을 데이터가 없으면 -1 반환 |
int read(byte[] b) | 배열 b의 크기만큼 읽어서 배열을 채우고 읽은 데이터 수를 반환 |
int read(byte[] b, int off, int len) | 최대 len만큼의 바이트를 읽어서 배열 b의 off위치부터 저장 실제로 읽은 바이트 수인 len개 리턴 (만약 len개를 모두 읽지 못 하면 실제로 읽은 바이트 수 리턴) |
int available() | 현재 읽을 수 있는 바이트 수를 반환 |
void mark(int readlimit) | 스트림에서 현재 위치를 표시, reset()에 의해 돌아감 |
boolean markSupported() | mark()와 reset() 지원 여부 확인 |
void reset() | mark() 를 마지막으로 호출한 위치로 이동 |
long skip(long n) | n 바이트 만큼 데이터를 건너뛰고 바이트 수를 반환 |
- OutputStream
메소드 | 설명 |
---|---|
void close() | 사용한 시스템 자원 반납 후 출력 스트림을 닫음 |
void flush() | 버퍼에 잔류하는 모든 바이트 출력 |
abstract void write(int i) | 주어진 값을 출력 |
void write(byte b[]) | 배열 b에 저장된 내용을 모두 출력 |
void write(byte b[], int index, int size) | 배열 b에 저장된 내용을 index부터 size만큼 출력 |
- 바이트 스트림 종류
구분 | 종류 | 하위클래스 | |
---|---|---|---|
InputStream | 기반 | FileInputStream | |
PipedInputStream | |||
ByteArrayInputStream | |||
StringBufferedInputStream | |||
보조 | FilterInputStream | LineNumberInputStream | |
DataInputStream | |||
BufferedInputStream | |||
PushbackInputStream | |||
SequenceInputStream | |||
ObjectInputStream | |||
OutputStream | 기반 | FileOutputStream | |
PipedOutputStream | |||
ByteArrayOutputStream | |||
보조 | FilterOutputStream | DataOutputStream | |
BufferedOutputStream | |||
PrintStream | |||
ObjectOutputStream |
문자 스트림
- 문자단위(2byte)로 데이터 전송
- 바이트 스트림과 사용방법은 거의 같다
- 영어 이외의 문자에 대한 처리와 인코딩을 내부에서 처리한다
- 문자 스트림의 최상위 클래스는 Reader 와 Writer이다
=> InputStream이 Reader로 OutputStream이 Writer에 대응되는 것으로 활용방법은 거의 같다 => 문자 스트림의 최상위 클래스로써 둘 다 추상 클래스이다
[ Reader ]
메소드 | 설명 |
---|---|
void close() | 사용한 시스템 자원 반납 후 입력 스트림을 닫음 |
int read() | 입력 스트림으로부터 한 개의 문자를 읽고 리턴 |
int read(char[] c) | 입력 스트림으로부터 읽은 문자들을 매개 값으로 주어진 문자 배열 c에 저장하고 실제로 읽은 문자 수 리턴 |
int read(char[] c, int off, int len) | 입력 스트림으로부터 len개의 문자만큼 읽고 매개 값으로 주어진 문자배열 c[off]부터 len개까지 저장, 실제로읽은 문자 수인 len개 리턴 |
void mark(int limit) | 스트림의 현재 위치를 표시 |
void reset() | 스트림을 mark된 위치로 되돌림 |
long skip(long l) | 주어진 개수 l 만큼의 문자를 건너뜀 |
[ Writer ]
메소드 | 설명 |
---|---|
void write(int c) | 출력 스트림으로 매개 값이 주어진 한 문자를 보냄 |
void write(char[] c) | 출력 스트림에 매개 값으로 주어진 문자 배열 c의 모든 문자를 보냄 |
void write(char[] c, int off, int len) | 출력 스트림에 매개 값으로 주어진 문자 배열 c[off]부터 len개까지의 문자 보냄 |
void write(String str) | 출력 스트림에 매개 값으로 주어진 문자열을 보냄 |
void write(String str, intoff, intlen) | 츨력 스트림에 매개 값으로 주어진 문자열 off순번부터 len개까지 문자 보냄 |
void flush() | 버퍼에 잔류하는 모든 문자열 출력 |
void close() | 사용한 시스템 자원 반납 후 출력 스트림을 닫음 |
[ 문자 스트림 종류 ]
Reader | 기반 | CharArrayReader | |
---|---|---|---|
PipedReader | |||
StringReader | |||
보조 | BufferedReader | LineNumberReader | |
InputStreamReader | |||
FilterReader | PushbackReader | ||
Writer | 기반 | CharArrayWriter | |
PipedWriter | |||
StringWriter | |||
보조 | BufferedWriter | ||
OutputStreamWriter | |||
FilterWriter |
문자 스트림과 바이트 스트림 비교
-
기반 스트림
바이트 스트림 문자 스트림 FileInputStream
FileOutputStreamFileReader
FileWriterByteArrayInputStream
ByteArrayOutputStreamCharArrayReader
CharArrayWriterPipedInputStream
PipedOutputStreamPipedReader
PipedWriterStringBufferInputStream
StreainBufferOutputStreamStringReader
StringWriter- 다만 StringBufferInputStream과 StringBufferOutputStream은 JDK 1.1부터 사용되지 않음
-
보조 스트림
바이트 보조 스트림 문자 보조 스트림 BufferedInputStream
BufferedOutputStreamBufferedReader
BufferedWriterFilterInputStream
FilterOutputStreamFilterReader
FilterWriterLineNumberInputStream LineNumberReader PrintStream PrintWriter PushbackInputStream PushbackReader - LineNumberInputStream은 JDK 1.1부터 사용되지 않음
보조 스트림 종류
종류 | 기능 |
---|---|
InputStreamReader / OutputStreamWriter | 문자 변환 |
BufferedInputStream / BufferedOutputStream | 입출력 성능 향상 |
DataInputStream / DataOutputStream | 기본 데이터 타입 출력 |
ObjectInputStream / ObjectOutputStream | 객체 입출력 |
[ BufferedReader와 BufferedWriter ]
- 입출력의 효율을 높이기 위해 버퍼를 이용한 보조스트림이다
- 다른 보조스트림에 비해 가장 많이 쓰인다고 볼 수 있다
-
입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업을 한다
=> 입출력 횟수를 줄여 실행 성능 향상 -
생성자
생성자 설명 BufferedReader(Reader in) 문자 입력 스트림 in에 대해 기본 크기의 버퍼를 갖는 객체를 생성 BufferedReader(Reader in , int size) 문자 입력 스트림 in에 대해 size 크기의 버퍼를 갖는 객체를 생성 BufferedWriter(Writer out) 문자 출력 스트림 out에 대해 기본 크기의 버퍼를 갖는 객체를 생성 BufferedWriter(Writer out, int size) 문자 출력 스트림 out에 대해 size 크기의 버퍼를 갖는 객체를 생성 -
메소드
종류 메소드 설명 BufferedReader String readLine() 한 줄을 읽는다. “\n”, “\r”을 만날 때 까지 읽음 BufferedWriter String newLine() 문자 출력 시 줄 바꿈이 필요할 때 사용
직렬화와 역직렬화
-
직렬화(Serialization)
- 데이터를 파일에 쓰거나 전송할 때 바이트 단위로 분해하여 순차적으로 보내는 것을 말한다
=> 자바에서는 객체를 데이터 스트림으로 만드는 것을 뜻한다
=> 객체의 데이터를 출력하기 위해 연속적인 데이터로 변환하는 것 - Serializable 인터페이스를 implements하여 구현한다
- 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환한다
=> 하지만 transient키워드를 사용한 필드는 직렬화에서 제외
- 데이터를 파일에 쓰거나 전송할 때 바이트 단위로 분해하여 순차적으로 보내는 것을 말한다
-
역직렬화(Deserialization)
- 직렬화와 반대의 경우를 말한다
=> 스트림으로부터 데이터를 입력받아 객체를 만드는 것 - 직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용한다
- 단, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화에 실패함
- 직렬화와 반대의 경우를 말한다
-
직렬화가 가능한 객체의 조건
- 기본형 타입
- Serializable 인터페이스를 구현한 클래스
- 객체 멤버 중 Serializable 인터페이스를 구현하지 않은 객체가 존재하면 안 된다
- transient키워드가 사용된 멤버는 전송되지 않는다
=> 보안상 데이터를 직렬화하면 안되는 경우 transient 키워드를 붙여 데이터가 null로 전송되도록 할 수 있다
-
serialVersionUID
- 직렬화한 클래스와 같은 클래스임을 알려주는 식별자 역할을 한다
- 컴파일 시 JVM이 자동으로 생성해주므로 동작은 하지만 직접 선언하는 것을 권장하고 있다
=> 자동 생성 시 역직렬화에서 예상하지 못한 InvalidClassException을 유발할 수 있기 때문 private static final long serialVersionUID = -6423919775137290062L;
와 같은식으로 사용한다
댓글남기기