1. 입출력 스트림이란(I/O Stream)?
- 컴퓨터 공학에서 스트림은 연속적인 데이터의 흐름을 의미합니다.
- 입력 스트림은 키보드, 네트워크 등과 같은 입력 장치와 연결되어 입력 장치로부터
입력된 데이터가 프로그램으로 흘러가게 합니다
- 출력 스트림은 자바 프로그램에서 출력되는 데이터를 LCD 스크린, 네트워크 장치, 프린터 등과
같은 장치에 순서대로 흘러가게 합니다.
- 입출력 스트림을 통해 흘러가는 데이터의 기본 단위는 바이트(Byte)입니다.
2. 입출력 스트림의 특징
- 입력 스트림은 데이터가 입력 장치에서 자바 프로그램으로 들어가는 방향이며,
출력 스트림은 자바 프로그램에서 출력 장치로 데이터가 이동하는 방향입니다.
즉, 스트림은 단방향입니다.
- 입력 스트림에 먼저 들어온 데이터가 프로그램에 먼저 전달되고,
출력 스트림은 자바 프로그램에서 출력한 순서대로 출력 장치에 보냅니다.
즉, 선입선출(FIFO) 구조입니다.
3. 바이트 스트림과 문자 스트림의 특징
- 자바에서 스트림은 바이트 스트림과 문자 스트림으로 나뉩니다.
- 클래스 이름에 Stream이 붙으면 바이트 스트림을 처리하기 위한 클래스이며
Reader, Writer가 붙으면 문자 스트림을 처리하는 클래스입니다.
- 바이트 스트림은 입출력되는 바이트의 바이너리 값을 있는 그대로 처리하기 때문에
스트림에 들어오는 데이터가 문자이든 단순 바이너리 정보이든 상관없이 처리할 수 있습니다.
- 하지만, 문자 스트림은 오직 문자만을 다루기 때문에 바이트 정보가 들어오면 오류로 처리합니다.
4. 바이트 스트림
- 바이트 스트림은 8비트의 바이트 단위로 바이너리 데이터가 흐르는 스트림입니다.
- 바이너리 데이터를 그대로 출력하기 때문에 동영상이나 이미지의 입출력뿐만 아니라
문자들로 구성되어 있는 텍스트 파일도 입출력할 수 있습니다.
4-1. 바이트 입출력 스트림 클래스
InputStream / OutputStream - 추상 클래스이며, 바이트 입출력 처리를 위한 기능을 가진 슈퍼 클래스입니다.
FileInputStream / FileOutputStream - 파일 입출력을 위한 클래스로서, 파일로부터 바이너리 데이터를 읽거나 파일에 바이너리 데이터를 저장할 수 있습니다.
DataInputStream / DataOutputStream - boolean, char, byte, int, double 등과 같은 값을 바이너리 형태로 입출력하며 문자열도 바이너리 형태로 입출력할 수 있습니다. |
4-2. FileInputStream 클래스의 생성자
FileInputStream(File file) |
file이 지정하는 파일로부터 입력받는 FileInputStream 생성 |
FileInputStream(String name) |
name이 지정하는 파일로부터 입력받는 FileInputStream 생성 |
4-3. InputStream과 FileInputStream의 공통 주요 메소드
int read() |
입력 스트림에서 한 바이트를 읽어 int형으로 리턴 |
int read(byte[] b) |
최대 배열 b의 크기만큼 바이트를 읽음 실제 읽은 바이트 수 리턴 |
int read(byte[] b, int off, int len) |
최대 len개의 바이트를 읽어 b 배열의 off 위치에 저장, 실제 읽은 바이트 수 리턴 |
int available() |
입력 스트림에서 현재 읽을 수 있는 바이트 수 리턴 |
void close() |
입력 스트림을 닫고 관련된 시스템 자원 해제 |
4-4. FileOutputStream 클래스의 생성자
FileOutputStream(File file) |
file이 지정하는 파일에 출력하는 FileOutputStream 생성 |
FileOutputStream(String name) |
name이 지정하는 파일에 출력하는 FileOutputStream 생성 |
FileOutputStream (File file, boolean append) |
FileOutputStream을 생성하며 append가 true이면 file이 지정하는 파일의 마지막부터 데이터 저장 |
FileOutputStream (String name, boolean append) |
FileOutputStream을 생성하며 append가 true이면 name 이라는 이름을 가진 파일의 마지막부터 데이터 저장 |
4-5. OutputStream과 FileOutputStream의 공통 주요 메소드
void write(int b) |
int 형으로 넘겨진 한 바이트를 출력 스트림으로 출력 |
void write(byte[] b) |
배열 b의 바이트를 모두 출력 스트림으로 출력 |
void write(byte[] b, int off, int len) |
len 크기만큼 off부터 배열 b를 출력 스트림으로 출력 |
void flush() |
출력 스트림에서 남아 있는 데이터 모두 출력 |
void close() |
출력 스트림을 닫고 관련된 시스템 자원 해제 |
4-6. 바이트 스트림과 바이너리 파일 입출력
- InputStream 클래스는 추상 클래스이므로 사용할 수 없기 때문에 목적에 따라 이를 상속받은
FileInputStream이나 DataInputStream 클래스를 이용합니다.
다음 예제와 같이 파일을 읽을 때는 FileInputStream 클래스를 이용하면 됩니다.
- 위 프로그램을 출력한 결과는 다음과 같습니다! 파일에 출력했으니 파일을 열어봐야하지요.
- 에러가 난 것 같지만 아닙니다. 출력 파일인 test.txt에 결과 값을 바이너리로 저장하기 때문에
메모장으로는 열어서 확인할 수 없습니다.
- 바이너리 파일은 EditPlus같은 텍스트 편집기를 이용해야 확인할 수 있는데, 이때 인코딩 옵션을
16진수 보기인 Hexviewer로 선택하여 열면 16진수로 표시된 내용을 볼 수 있습니다.
5. 문자 스트림
- 문자 스트림은 유니코드로 된 문자 단위의 데이터를 다루는 스트림입니다.
- 문자화되지 않는 바이너리 값들은 문자 스트림에 존재할 수 없기 때문에
이미지 등과 같은 정보는 처리할 수 없습니다.
5-1. 문자 입출력 스트림 클래스
Reader / Writer - 추상 클래스이며, 문자 입출력 처리를 위한 기능을 가진 슈퍼 클래스입니다.
InputStreamReader / OutputStreamReader - 이 클래스는 바이트 스트림과 문자 스트림을 연결시켜줍니다. 지정된 문자 집합을 이용하며 InputStreamReader는 바이트들을 읽어 지정된 문자 집합 내의 문자로 인코딩하며, OutputStreamReader는 문자를 바이트들로 디코딩하여 스트림으로 출력합니다.
FileReader / FileWriter - FileReader와 FileWriter는 텍스트 파일로부터 직접 문자 데이터를 읽고 기록합니다. FileReader는 FileInputStream과 연결하여 읽어 들인 바이트를 문자 데이터로 변환하며 FileWriter는 FileOutputStream을 이용하여 문자 스트림을 바이트 스트림으로 변환하여 파일에 기록합니다. |
5-2. InputStreamReader와 FileReader 의 생성자
InputStreamReader(InputStream in) |
in으로부터 읽는 기본 문자 집합의 InputStreamReader 생성 |
InputStreamReader (InputStream in, Charset cs) |
in으로부터 읽는 cs 문자 집합의 InputStreamReader 생성 |
InputStreamReader (InputStream in, String charsetName) |
in으로부터 읽는 charsetName 문자 집합의 InputStreamReader 생성 |
FileReader(File file) |
file로부터 읽는 FileReader 생성 |
FileReader(String name) |
name 이름의 파일로부터 읽는 FileReader 생성 |
5-3. InputStream과 FileInputStream의 공통 주요 메소드
int read() |
한 개의 문자를 읽어 정수형으로 리턴 |
int read(char[] cbuf) |
문자들을 읽어 cbuf 배열에 저장하고 읽은 개수 리턴 |
int read(char[] cbuf, int off, int len) |
최대 len 크기만큼 읽어 off부터 저장하고 실제 읽은 개수 리턴 |
boolean ready() |
입력 스트림이 문자를 읽어 들일 수 있는 상태인지 리턴 |
String getEncoding() |
스트림이 사용하는 문자 집합의 이름 리턴 |
void reset() |
스트림 리셋, 스트림이 마킹되어 있으면 그 위치부터 시작 |
void close() |
입력 스트림을 닫고 관련된 시스템 자원 해제 |
5-4. OutputStreamWriter와 FileWriter의 생성자
OutputStreamWriter (OutputStream out) |
out에 출력하는 기본 문자 집합의 OutputStreamWriter 생성 |
OutputStreamWriter (OutputStream out, Charset cs) |
out에 출력하는 cs 문자 집합의 OutputStreamWriter 생성 |
OutputStreamWriter (OutputStream out, String charsetName) |
charsetName 문자 집합의 OutputStreamWriter 생성 |
FileWriter(File file) |
file에 데이터를 저장할 FileWriter 생성 |
FileWriter(String name) |
name 파일에 데이터를 저장할 fileWriter 생성 |
FileWriter(File file, boolean append) |
FileWriter를 생성하며, append가 true이면 파일의 마지막부터 데이터를 저장 |
FileWriter(String name, boolean append) |
FileWriter를 생성하며, append가 true이면 파일의 마지막부터 데이터를 저장 |
5-5. Writer, OutputStreamWriter, FileWriter의 공통 주요 메소드
void write(int c) |
c를 char로 변환하여 한 개의 문자 출력 |
void write(String str, int off, int len) |
인덱스 off부터 len개의 문자를 str문자열에서 출력 |
void write(char[] cbuf, int off, int len) |
인덱스 off부터 len개의 문자를 배열 cbuf에서 출력 |
void flush() |
스트림에 남아 있는 데이터 모두 출력 |
String getEncoding() |
스트림이 사용하는 문자 집합의 이름 리턴 |
void close() |
입력 스트림을 닫고 관련된 시스템 자원 해제 |
5-6. 문자 스트림과 텍스트 파일 입출력
- FileReader의 생성자는 File 객체나 문자열이 가리키는 파일과 연결된 문자 스트림을 생성합니다.
- InputStreamReader의 생성자에 InputStream 객체가 전달되며, InputStreamReader는
InputStream 객체가 파일에서 읽은 바이트 데이터를 문자 집합을 통해 문자로 변환합니다.
- 이를 위해 InputStream의 생성자에는 문자 집합을 지정하는 Charset 객체를 전달합니다.
6. 버퍼 입출력 스트림
- 입출력 데이터를 일시적으로 저장하는 버퍼를 이용하여 입출력 효율을 개선할 수 있습니다.
- 입출력시 운영체제의 API 호출 횟수를 줄여 입출력 성능을 개선합니다
* 출력 : 여러 번 출력되는 데이터를 버퍼에 모아두고 한 번에 장치로 출력
* 입력 : 입력 데이터를 버퍼에 모아두고 한 번에 프로그램에 전달
6-1. 버퍼 입출력 스트림 클래스
- 바이트 버퍼 스트림 : 바이트 단위의 바이너리 데이터를 처리하는 버퍼 스트림입니다.
BufferedInputStream과 BufferedOutputStream이 있습니다.
- 문자 버퍼 스트림 : 유니코드의 문자 데이터만 처리하는 버퍼 스트림입니다.
BufferedReader와 BufferedWriter가 있습니다.
6-2. 바이트 버퍼 스트림 클래스의 생성자
BufferedInputStream(InputStream in) |
in을 연결하는 디폴트 크기의 입력 버퍼 스트림 생성 |
BufferedInputStream (InputStream in, int size) |
in을 연결하는 size 크기의 입력 버퍼 스트림 생성 |
BufferedOutputStream (OutputStream out) |
out을 연결하는 디폴트 크기의 출력 버퍼 스트림 생성 |
BufferedOutputStream (OutputStream out, int size) |
out을 연결하는 size 크기의 출력 버퍼 스트림 생성 |
6-3. 문자 버퍼 스트림 클래스의 생성자
BufferedReader(Reader in) |
in을 연결하는 디폴트 크기의 문자 입력 버퍼 스트림 생성 |
BufferedReader(Reader in, int sz) |
in을 연결하는 sz 크기의 문자 입력 버퍼 스트림 생성 |
BufferedWriter(Writer out) |
out을 연결하는 디폴트 크기의 문자 출력 버퍼 스트림 생성 |
BufferedWriter(Writer out, int sz) |
out을 연결하는 sz 크기의 문자 출력 버퍼 스트림 생성 |
6-4. 버퍼 출력 스트림 예제
- 20바이트 크기의 버퍼를 가지고 System.out 표준 스트림을 이용하여 화면에 출력
(실행 결과는 system.ini 파일을 읽은 결과가 콘솔창에 출력됩니다.)
7. File 클래스
- File 클래스는 경로명이 java.io.file로서 파일과 디렉터리 경로명의 추상적 표현입니다.
- File 클래스는 파일 삭제, 디렉터리 생성 등과 같은 중요한 파일 관리 작업을 지원합니다.
7-1. File 클래스의 생성자
File(File parent, String child) |
parent 디렉터리에 child 이름의 디렉터리나 파일을 나타내는 File 객체 생성 |
File(String pathname) |
pathname이 나타내는 File 객체 생성 |
File(URI uri) |
file:URI를 추상 경로명으로 변환하여 File 객체 생성 |
7-2. File 클래스의 주요 메소드
boolean mkdir() |
추상 경로명이 나타내는 새로운 디렉터리 생성 |
String[] list() |
추상 경로명이 나타내는 디렉터리 내의 파일과 디렉터리 이름의 문자열 배열 리턴 |
String[] listFiles() |
추상 경로명이 나타내는 디렉터리 내의 파일 이름의 문자열 배열 리턴 |
boolean renameTo(File dest) |
dest가 지정하는 추상 경로명으로 파일 이름 변경 |
boolean delete() |
추상 경로명이 나타내는 파일 또는 디렉터리 삭제 |
long length() |
추상 경로명이 나타내는 파일의 크기 리턴 |
String getPath() |
추상 경로명 전체를 문자열로 변환하여 리턴 |
String getName() |
추상 경로명이 나타내는 파일 또는 디렉터리 이름을 문자열로 리턴 |
boolean isFile() |
추상 경로명이 일반 파일이면 true 리턴 |
boolean isDirectory() |
추상 경로명이 디렉터리이면 true 리턴 |
long lastModified() |
추상 경로명이 나타내는 파일이 마지막으로 변경된 시간 리턴 |
boolean exists() |
추상 경로명이 나타내는 파일 또는 디렉터리가 존재하면 true 리턴 |
댓글 ( 4)
댓글 남기기