Notice
코딩항해기
[JAVA] 파일 입출력 본문
자바 입출력 스트림 특징
자바에서는 입출력이 동시에 진행되는 것이 아니라 독립적으로 한 가지 기능만 동작하기 때문에 데이터를 교환하기 위해서는 입력 스트림과 출력 스트림이 따로 필요하다.
- 스트림은 입출력 장치와 자바 프로그램 간의 연결 통로로 스트림의 양 끝에서 전달이 이루어진다.
- 단방향 통신이므로 입력 스트림과 출력스트림을 별도로 사용해야하며 FIFO(First In Fires Out) 선입선출 구조이다.
- 연속된 데이터의 흐름으로 입출력 진행 시 다른 작업을 할 수 없는 상태가 된다.
- 입출력 대상을 변경하기 편하며 동일한 프로그램 구조를 유지할 수 있다.
입출력 스트림의 종류
IO(input/output) 입출력 | 바이트 기반 스트림 | byte단위로 파일을 읽고 출력할 때 사용된다. 모든 타입의 데이터가 가능하다. |
InputStream / OutputStream | ||
문자 기반 스트림 | 문자 단위로 파일을 읽고 출력할 때 사용된다. 문자 데이터만 가능하다. |
|
Reader / Writer |
바이트 기반 스트림
InputStream | FileInputStream | - |
FilterInputStream | DataInputStream | |
BufferedInputStream | ||
ByteArrayInputStream | - | |
ObjectInputStream | - | |
OutputStream | FileOutputStream | - |
FilterOutputStream | DataOutputStream | |
BufferedOutputStream | ||
ByteArrayOutputStream | - | |
ObjectOutputStream | - |
바이트 기반 입력 스트림 메서드
int read() | 문자를 1byte씩 읽고 반환, 더 이상 읽을 문자가 없으면 -1을 반환한다. |
int read(byte[] b) | 배열에 읽은 문자를 저장하고 읽은 수만큼 반환, 더 이상 읽을 문자가 없으면 -1을 반환한다. |
int read(byte[] b, int offset, int len) | 배열에 정해진 범위만큼 읽어서 저장하고, offset은 시작위치, len은 길이이다. |
int available() | 스트림으로부터 읽어올 수 있는 데이터 크기를 반환한다. |
close() | 스트림 사용을 종료하고 자원을 반환한다. |
바이트 기반 출력 스트림 메서드
int write(int b) | 1byte 출력한다. |
int write(byte[] b) | 배열의 모든 바이트를 출력한다. |
int write(byte[] b. int offset, int len) | 배열의 정해진 범위만큼 읽어서 출력하고, offset은 시작위치, len은 길이이다. |
void flush() | 출력 버퍼에 잔류하는 모든 내용을 출력한다. |
close() | 스트림 사용을 종료하고 자원을 반환한다. |
문자 기반 스트림
Reader | BufferedReader | |
CharArrayReader | ||
InputStreamReader | FileReader | |
StringReader | ||
Writer | BufferedWriter | |
CharArrayWriter | ||
InputStreamWriter | FileWriter | |
StringWriter |
문자 기반 입력 스트림 메서드
int read() | 1개의 문자를 읽고 반환, 더 이상 읽을 문자가 없으면 -1을 반환한다. |
int read(char[] cbuf) | 배열에 읽은 문자를 저장하고 읽은 수만큼 반환, 더 이상 읽을 문자가 없으면 -1을 반환한다. |
int read(char[] cbuf, int offset, int len) | 배열에 정해진 범위만큼 읽어서 저장하고, offset은 시작위치, len은 길이이다. |
close() | 스트림 사용을 종료하고 자원을 반환한다. |
문자 기반 출력 스트림 메서드
int write(char c) | 단일 문자를 출력한다. |
int write(char[] cbuf) | 배열의 모든 문자를 출력한다. |
int write(String str) | 문자열을 출력한다. |
int write(char[] cbuf. int offset, int len) | 배열의 정해진 범위만큼 읽어서 출력하고, offset은 시작위치, len은 길이이다. |
void flush() | 출력 버퍼에 잔류하는 모든 내용을 출력한다. |
close() | 스트림 사용을 종료하고 자원을 반환한다. |
보조 스트림
기반 스트림 | 대상에 직접 자료를 읽고 쓰는 스트림이다. |
보조 스트림 | 직접 읽고 쓰는 기능 없이 기반 스트림에 추가로 사용할 수 있는 스트림이다. |
입출력에서 버퍼라는 메모리를 활용해 작업하면 실행 성능을 향상시킬 수 있는데, 버퍼는 크기가 작아 많은 양의 데이터를 처리하기에는 부족하다. 이때 보조스트림 중 Buffered가 붙은 스트림을 활용하여 메모리 버퍼를 추가해 스트림 성능을 향상시켜줄 수 있다.
바이트 기반 : BufferedInputStream, BufferedOutputStream
문자 기반 : BufferedWriter, BufferedReader
*기존의 IO스트림은 바로 데이터를 전송했지만, 해당 보조스트림은 버퍼에 데이터를 저장해 한 번에 전송한다.
File 클래스 메서드
boolean delete() | 파일 또는 폴더 삭제(성공시 true반환) |
boolean createNewFile() | 새로운 파일이나 내용이 없는 파일 생성 |
boolean mkdir() | 경로에 계층이 여러 개 있어도 최상위 경로의 폴더만 생성 |
boolean mkdirs() | 경로 상의 필요한 모든 폴더 생성 |
boolean exists() | 폴더 또는 파일의 존재 여부 반환 |
boolean isFile() | 파일 여부 반환 |
boolean isDirectory() | 폴더 여부 반환 |
long length() | 파일 크기 반환 |
boolean canWrite() | 쓰기 가능한 파일 여부 반환 |
boolean canRead() | 읽기 가능한 파일 여부 반환 |
String getPath() | 상대 경로 반환 |
String getAbsolutePath() | 절대 경로 반환 |
직렬화 / 역직렬화
직렬화란 자바 시스템 내부에서 사용하는 객체나 데이터를 외부의 시스템이 사용할 수 있도록 바이트 단위의 데이터로 변환하는 기술이다. 즉, 클래스 형태의 데이터를 바이트 단위로 변환한다.
이렇게 바이트 단위로 변환된 데이터를 다시 객체 형태로 변환하는 것을 역직렬화라고 한다.
'JAVA' 카테고리의 다른 글
[JAVA] StringBuilder (0) | 2024.09.10 |
---|---|
[JAVA] POJO (0) | 2024.08.21 |
[JAVA] 스레드 Thread (0) | 2024.07.28 |
[JAVA] 람다식 (익명 메서드) (+함수형 인터페이스) (0) | 2024.07.27 |
[JAVA] 사용자 정의 예외 (0) | 2024.07.25 |