[자바 기초] 입출력 IO
2021, Jun 29
입출력
입출력 IO
입출력 정의
- Input Out 약자
- 컴퓨터 내부 또는 외부 장치와 프로그램 간 데이터를 주고 받는 것
- 하드웨어 장치에 직접 접근이 필요
- 입출력 데이터를 처리할 공통적 방법으로 스트림 이용
스트림 Stream
스트림 정의
- 입출력 장치에서 데이터를 읽고 쓰기 위해 사용하는 자바에서 제공하는 클래스
- 모든 스트림은 단방향 Simplex
- 각각의 장치마다 연결할 수 있는 스트림이 존재
- 하나의 스트림으로 입출력을 동시에 수행 불가능
- 동시에 수행할 경우 2개의 스트림 사용
스트림 분류
- 바이트 기반 스트림
- 입력 바이트 스트림
- 최상위 클래스 InputStream
- 하위 클래스 … InputStream
- 출력 바이트 스트림
- 최상위 클래스 OutputStream
- 하위 클래스 … OutputStream
- 입력 바이트 스트림
- 문자 스트림
- 입력 문자 스트림
- 최상위 클래스 Reader
- 하위 클래스 … Reader
- 출력 문자 스트림
- 최상위 클래스 Writer
- 하위 클래스 … Writer
- 입력 문자 스트림
스트림 종류
- Reader
- BufferedReader
- LineNumberReader
- CharArrayReader
- InputStreamReader
- FileReader
- FilterReader
- PushbackReader
- PipedReader
- StringReader
- BufferedReader
- InputStream
- FileInputStream
- PipedInputStream
- FilterInputStream
- LineNumberInputStream
- DataInputStream
- BufferedInputStream
- PushbackInputStream
- ByteArrayInputStream
- SequenceInputStream
- StringBufferedInputStream
- ObjectInputStream
- Writer
- BufferedWriter
- CharArrayWriter
- InputStreamWriter
- FileWriter
- FilterWriter
- PipedWriter
- StringWriter
- OutputStream
- FileOutputStream
- PipedOutputStream
- FilterOutputStream
- DataOutputStream
- BufferedOutputStream
- PrintStream
- ByteArrayOutputStream
- ObjectOutputStream
InputStream
- 바이트 기반의 입력 스트림의 최상위 클래스
- 추상 클래스
Return Type | Method | Description |
---|---|---|
int | read() | 입력 스트림으로부터 1바이트를 읽고 읽은 데이터 리턴 |
int | read(byte[] b) | 입력 스트림으로부터 읽은 데이터들을 바이트 배열 b에 저장하고 실제로 읽은 바이트 수 리턴 |
int | read(byte[] b, int off, int len) | 입력 스트림으로부터 len개의 바이트만큼 읽고 바이트 배열 b[off]부터 len개까지를 저장하고 실제로 읽은 바이트 수 리턴 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수 리턴 |
void | close() | 사용한 시스템 자원 반납 후 입력 스트림을 닫음 |
OutputStream
- 바이트 기반의 출력 스트림의 최상위 클래스
- 추상 클래스
Return Type | Method | Description |
---|---|---|
void | write(int c) | 출력 스트림으로부터 c를 보냄 |
void | write(char[] c) | 출력 스트림에 문자 배열 c의 모든 문자를 보냄 |
void | write(char[] c, int off, int len) | 출력 스트림에 문자 배열 c[off]부터 len개의 문자를 보냄 |
void | write(String str) | 출력 스트림에 str을 보냄 |
void | write(String str, int off, int len) | 출력 스트림에 str의 off순번부터 len개의 문자를 보냄 |
void | flush() | 버퍼에 잔류하는 모든 문자열 출력 |
void | close() | 사용한 시스템 자원 반납 후 출력 스트림을 닫음 |
파일 File
File 클래스
- 파일 시스템의 파일을 표현하는 클래스
- 파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공
객체 생성
File file = new File("파일 경로");
File file = new File("C:/data/test.txt");
파일 디렉토리 생성 및 삭제 메소드
Return Type | Method | Description |
---|---|---|
boolean | createNewFile() | 새로운 파일 생성 |
boolean | mkdir() | 새로운 디렉토리 생성 |
boolean | mkdirs() | 경로상 없는 모든 디렉토리 생성 |
boolean | delete() | 파일 또는 디렉토리 삭제 |
파일 디렉토리 정보 리턴 메소드
Return Type | Method | Description |
---|---|---|
boolean | canExecute() | 파일 실행 가능 여부 |
boolean | canRead() | 파일 읽을 수 있는지 여부 |
boolean | canWrite() | 파일 변경 가능 여부 |
String | getName() | 파일 이름 반환 |
String | getParent() | 부모 경로 이름 반환 |
File | getParentFile() | 부모 파일 반환 |
String | getPath() | 경로 반환 |
boolean | isDirectory() | 디렉토리면 참 |
boolean | isFile() | 파일이면 참 |
boolean | isHidden() | 숨김파일이면 참 |
long | lastModified() | 마지막 수정일 리턴 |
long | length() | 파일 크기 리턴 |
String[] | list() | 디렉토리에 포함된 파일과 디렉토리를 String 배열로 반환 |
String[] | list(FilenameFilter filter) | 디렉토리에 포함된 파일과 디렉토리 중 filter에 해당하는 것만 반환 |
File[] | listFiles() | 디렉토리에 포함된 파일과 디렉토리를 File 배열로 반환 |
File[] | listFile(FilernameFilter filter) | 디렉토리에 포함된 파일과 디렉토리 중 filter에 해당하는 것만 반환 |
파일 관련 기반 스트림
FileInputStream
- 파일 데이터를 바이트 단위로 읽을 때 사용
- 모든 종류의 파일 읽기 가능
- 객체 생성
- FileInputStream 객체가 생성될 때 파일과 직접 연결
- 만약 파일이 존재하지 않으면 예외 발생 (FileNotFound)
FileInputStream fis = new FileInputStream("C:/data/test.txt");
FileOutputStream
- 파일 데이터를 바이트 단위로 저장할 때 사용
- 모든 종류의 파일 저장 가능
- 객체 생성
- FileOutputStream 객체가 생성될 때 파일과 직접 연결
- 만약 파일이 존재하지 않으면 자동 생성
- 이미 존재하는 경우 덮어쓰기
FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
- 기존 파일에 이어서 작성하고 싶은 경우 아래와 같이 작성
FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);
FileReader
- 텍스트 파일로부터 문자 단위로 읽을 때 사용
- 텍스트 파일만 읽기 가능
- 객체 생성
- FileReader 객체가 생성될 때 파일과 직접 연결
- 만약 파일이 존재하지 않으면 예외 발생 (FileNotFound)
FileReader fr = new FileReader("C:/data/test.txt"); FileReader fr = new FileReader(new File("C:/data/test.txt"));
FileWriter
- 텍스트 파일로부터 문자 단위로 저장할 때 사용
- 텍스트 파일만 저장 가능
- 객체 생성
- FileWriter 객체가 생성될 때 파일과 직접 연결
- 만약 파일이 존재하지 않는 경우 자동 생성
- 이미 존재하는 경우 덮어쓰기
FileWriter fw = new FileWriter("C:/data/test.txt");
- 기존 파일에 이어서 작성하고 싶은 경우 아래와 같이 작성
FileWriter fw = new FileWriter("C:/data/test.txt", true);
보조 스트림
보조 스트림 정의
- 스트림의 기능을 향상시키거나 새로운 기능을 추가할 때 사용
- 실제 데이터를 주고 받지 않기 때문에 입출력 처리 불가능
- 기반 스트림 생성 이후 이를 이용하여 보조 스트림 생성 ( 스트림 결합 )
보조 스트림 종류
- 문자 변환
- InputStreamReader
- OutputStreamWriter
- 입출력 성능
- BufferedInputStream
- BufferedOutputStream
- 기본 데이터 타입 출력
- DataInputStream
- DataOutputStream
- 객체 입출력
- ObjectInputStream
- ObjectOutputStream
// 기반 스트림 생성
FileInputStream fis = new FileInputStream("Sample.txt");
// 보조 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis);
// 보조 스트림으로부터 데이터 읽어옴
bis.read();
문자 변환 보조 스트림
- 소스 스트림이 바이트 기반이지만 데이터가 문자일 경우 사용
- Reader Writer는 문자 단위로 출력하여 데이터가 문자인 경우 바이트 기반 스트림보다 편리하게 사용 가능
성능 향상 보조 스트림
- 느린 속도에 의해 입출력 성능에 영향을 미치는 소스를 이용하는 경우 사용
- 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업하여 성능 향상
기본 타입 입출력 보조 스트림
- 기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능 제공
- 입력된 자료형의 순서와 출력될 자료형의 순서 일치
- DataInputStream
- readBoolean() : boolean
- readByte() : byte
- readChar() : char
- readDouble() : double
- readFloat() : float
- readInt() : int
- readLong() : long
- readShort() : short
- readUTF() : String
- DataOutputStream
- writeBoolean(Boolean v) : void
- writeByte(Byte v) : void
- writeChar(char c) : void
- writeDouble(double v) : void
- writeFloat(float v) : void
- writeInt(int v) : void
- writeLong(long v) : void
- writeShort(short v) : void
- writeUTF() : void
객체 입출력 보조 스트림
- 객체를 파일 또는 네트워크로 입출력할 수 있는 기능 제공
- 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경 ( 직렬화 Serialization )
직렬화와 역직렬화
직렬화 Serialization
- Serializable 인터페이스를 구현
- 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환
- transient 키워드 사용 필드는 제외
역직렬화 Deserialization
- 직렬화 했을 때와 동일한 클래스 사용
- 클래스 이름이 같지만 클래스 내용이 변경된 경우 역직렬화 실패
serialVersionUID 필드
- 직렬화된 클래스와 같은 클래스 임을 알려주는 식별자 역할
- 컴파일시 JVM이 자동으로 정적 필드를 추가하여 별도로 작성하지 않아도 오류가 발생하지 않음
- 역직렬화에서 예상치 못한 InvalidClassException을 유발할 수 있어 명시 권장
private static final long serialVersionUID = 1L;