[JAVA] java.io 패키지와 스트림
스트림
- 순서가 있는 일련의 데이터 흐름을 의미
- 데이터 생산자(소스)와 데이터 소비자(목적지) 사이의 데이터가 지나가는 통로
- Java 언어에서 스트림을 통해 입출력을 수행할 수 있음
- 입력 스트림은 데이터 생산자(소스)와 연결
- 출력 스트림은 데이터 소비자(목적지)와 연결
- 입력 스트림은 데이터 생산자(소스)와 연결
- 다양한 입출력 종류(디스크, 문자 배열, 네트워크 소켓, 다른 프로그램 등)에 상관없이 동일한 방법으로 프로그램을 작성
- 스트림을 통해 입출력을 제어함
- 스트림을 통해 입출력을 제어함
스트림의 분류
- 입력스트림과 출력스트림
- 프로그램은 입력 스트림으로부터 데이터를 읽을 수 있음
- 데이터 소스가 설정되어야 함
- 데이터 소스가 설정되어야 함
- 프로그램은 출력스트림으로 데이터를 쓸 수 있음
- 데이터 목적지가 설정되어야 함
- 데이터 목적지가 설정되어야 함
- 프로그램은 입력 스트림으로부터 데이터를 읽을 수 있음
- 바이트 스트림과 캐릭터 스트림
- 바이트 스트림은 byte 단위로 데이터를 다룸
- (…)InputStream / (…)OutputStream
- (…)InputStream / (…)OutputStream
- 캐릭터 스트림은 char 단위로 데이터를 다룸
- (…)Reader / xxxWriter
- (…)Reader / xxxWriter
- 바이트 스트림은 byte 단위로 데이터를 다룸
- 기본 스트림과 보조 스트림
- 기본 스트림은 입출력 기능을 제공하는 스트림
- 보조 스트림은 자체적으로 입출력 기능을 수행할 수는 없어서 기본 스트림과 함께 사용되어야 하며, 보조 기능을 제공하는 스트림
- 기본 스트림은 입출력 기능을 제공하는 스트림
스트림 관련 클래스
처리단위 | 처리방향 | 입력 스트림 | 출력 스트림 |
---|---|---|---|
기본 스트림 | 바이트 스트림 | InputStream FileInputStream |
OutputStream FileOutputStream |
문자 스트림 | Reader FileReader |
Writer FileWriter |
|
보조 스트림 | 바이트 스트림 | BufferedInputStream DataInputStream ObjectInputStream |
BufferedOutputStream PrintStream DataOutputStream ObjectOutputStream |
문자 스트림 | BufferedReader |
BufferedWrite PrintWriter |
|
기타 | InputStramReader | OutputStreamWriter |
스트림 사용하기
- 어떤 스트림클래스를 사용할 것인가
- 입력 / 출력 스트림 선택
- 데이터 생산자와 소비자를 결정
- 기본 스트림을 반드시 사용해야 함
- 기본 스트림을 반드시 사용해야 함
- 문자 단위 / 바이트 단위 선택
- 보조 스트림이 필요한가
- 필요하다면 기본 스트림 객체를 먼저 생성하고, 기본스트림을 감싸 보조 스트림 객체를 생성함
- ex)
FileInputStream fis = new FileInputStream();
와 같이 기본 스트림을 생성해준 후BufferedInputStream bis = new BufferedInputStream (fis);
와 같이 보조스트림에 인자로 기본 스트림을 넣어줌
- 필요하다면 기본 스트림 객체를 먼저 생성하고, 기본스트림을 감싸 보조 스트림 객체를 생성함
- 입력 / 출력 스트림 선택
바이트 스트림
-
InputStream 클래스
바이트 단위 입력 스트림 클래스의 최상위 클래스
추상 클래스이며, 이것의 하위 클래스는 (…)InputStream
- 주요 메소드
1) abstract int read()
- 입력 스트림으로부터 1바이트를 읽어 정수로 리턴함
2) int read(byte[] b)
- 입력 스트림으로부터 읽어서 byte 배열에 저장
- 읽어 들인 바이트 개수를 리턴함
3) int read(byte[] b, int off, int len)
4) int availabel()
- 다음 read()할 때, 블로킹 없이 입력 스트림에서 읽을 수 있는 데이터 길이
5) long skip(long n)
- 입력 스트림에서 n 바이트를 건너 뜀
6) void mark(int readlimit), void reset()
- 현재 읽은 위치 기억 및 위치 이동
- 주요 메소드
-
OutputStream 클래스
바이트 단위 출력 스트림 클래스의 최상위 클래스
추상 클래스이며, 이것의 하위 클래스는 (…)OutputStream
- 주요 메소드
1) void write(int b)
- 1바이트의 데이터를 출력 스트림에 씀
2) void write(byte[] b)
- byte 배열의 내용을 출력 스트림에 씀
3) void write(byte[] b, int off, int len)
4) void close()
5) void flush()
- 주요 메소드
캐릭터 스트림
-
Reader 클래스
입력용 캐릭터 단위 스트림 클래스의 최상위 클래스
추상 클래스이며 이것의 하위 클래스는 (…)Reader
- 주요 메소드
1) int read()
- 1개 문자(2바이트)를 읽어 리턴함
2) int read(char[] cbuf)
- 문자를 읽어 char 배열에 저장함
- 읽어 들인 문자의 개수를 리턴함
3) boolean ready()
- 스트림이 읽힐 준비가 되었으면 true를 리턴함
4) abstract void close()
- 입력 스트림을 닫고 자원을 반납함
- 주요 메소드
-
Write 클래스
출력용 캐릭터 단위 스트림 클래스의 최상위 클래스
추상 클래스이며 이것의 하위 클래스는 (…)Writer
- 주요 메소드
1) void write(int c)
- 1개의 문자 2바이트를 출력함
2) void write(char[] cbuf)
3) void write(String str)
4) void write(String str, int off, int len)
5) abstract void close()
- 주요 메소드
파일 입출력
- 파일이나 디렉토리를 표한
- 상대 또는 절대 경로를 가짐
- 상대 또는 절대 경로를 가짐
- 파일/디렉토리를 조작할 수 있는 메소드 제공
- 이름과 경로의 조회
- 파일과 디렉토리의 생성과 삭제 (입출력 메소드는 제공되지 않음)
- 이름과 경로의 조회
- 생성자 : File(String pathname)
- pathname은 상대 또는 절대경로로 표현될 수 있음
- File myFile = new File(“c:\temp\data.txt”);
- pathname은 상대 또는 절대경로로 표현될 수 있음
- 주요 메소드
- boolean exists()
- boolean isDirectory(), boolean isFile()
- String getName()
- String getPath()
- long length
- boolean createNewFile()
- boolean delete()
- boolean mkdir(), boolean mkdirs()
- String[] list(), File[] listFiles()
- File 객체에 지정된 디렉터리 안에 들어있는 파일과 서브 디렉터리들의 이름을 문자열 배열(또는 경로를 File 배열)로 반환
- File 객체에 지정된 디렉터리 안에 들어있는 파일과 서브 디렉터리들의 이름을 문자열 배열(또는 경로를 File 배열)로 반환
- String getParent(), File getParentFile()
- 상위 경로의 이름(또는 File 객체)을 반환
- 상위 경로의 이름(또는 File 객체)을 반환
- static File[] listRoots()
- 루트 디렉토리들을 File 배열로 반환
- 루트 디렉토리들을 File 배열로 반환
- boolean exists()
RandomAccessFile 클래스
- 파일의 임의 위치에서 읽기/쓰기가 가능
- 파일을 오픈하고, 위치를 지정하고, 읽기/쓰기를 함
- 파일을 오픈하고, 위치를 지정하고, 읽기/쓰기를 함
- 읽고 쓰는 위치는 파일 포인터가 가리킴
- 읽기(또는 쓰기)는 파일 포인터가 가리키는 위치부터 바이트 단위로 읽음(또는 씀)
- 읽기(또는 쓰기)는 파일 포인터가 가리키는 위치부터 바이트 단위로 읽음(또는 씀)
- byte 단위로 읽고 쓰며, 파일 포인터가 이동됨
- 랜덤 엑세스 파일을 커다란 byte 배열로 볼 수 있음
- 랜덤 엑세스 파일을 커다란 byte 배열로 볼 수 있음
1) 생성자
- RandomAccessFile(File file, String mode)
- RandomAccessFile(String name, String mode)
- mode는 읽기 전용의 “r” 또는 읽기/쓰기 겸용의 “rw”
2) 주요 메소드
- int read()
- int read(byte[] b), int read(byte[] b, int off, int len)
- void seek(long pos)
- void write(byte[] b)
- void write(byte[] b, int off, int len)
FileInputStream과 FileOutputStream 클래스
- 파일로부터 데이터를 읽기/쓰기 위한 입력/출력용 기본 스트림
-
바이트 단위의 입력 출력
- 생성자
- FileInputStream 클래스
- 기존 파일과 연결된 입력 스트림 객체를 생성
- FileInputStream(File file), FileInputStream(String name)
- 기존 파일과 연결된 입력 스트림 객체를 생성
- FileOutputStream 클래스
- 기존 파일(없다면 생성)과 연결된 출력 스트림 객체를 생성
- FileOutputStream(String name)
- FileOutputStream(File file, boolean append)
- 기존 파일(없다면 생성)과 연결된 출력 스트림 객체를 생성
- FileInputStream 클래스
FileReader와 FileWriter 클래스
- 텍스트 파일을 다루기 위한 기본 스트림
-
문자 단위의 입력/출력
- 생성자
- FileReader 클래스
- FileReader(File file)
- FileReader(String fileName)
- FileReader(File file)
- FileWriter 클래스
- FileWriter(File file)
- FileWriter(String fileName)
- FileWriter(File file, boolean append)
- FileWriter(File file)
- FileReader 클래스
Console 입출력
- 콘솔 입출력을 제공하는 클래스
- 키보드 입력과 화면 출력을 편리하게 지원
- 키보드 입력과 화면 출력을 편리하게 지원
- 명령 프롬프트 창에서 실행해야 함
-
System.console()을 사용하여 콘솔 객체를 생성함
- 주요 메소드
1) String readLine()
- 한 라인을 읽음
2) char[] readPassword()
- 입력할 때 화면에 보이지 않음
3) PrintWriter writer(), Reader reader()
보조 스트림
- 기본스트림의 성능을 높이거나 보조 기능을 제공하는 스트림
- 입출력 기능을 직접 수행하지는 못함
- 보조 스트림을 생성할 때, 기본 스트림 객체를 생성자의 인자로 이용함
- 프로그램에서는 보조 스트림을 사용해 입출력하면 됨
- 프로그램에서는 보조 스트림을 사용해 입출력하면 됨
- 보조 스트림의 종류
1) 버퍼링 기능의 제공
- BuffferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
2) Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능의 제공
- DataInputStream
- DataOutputStream
3) 다양한 출력 형식의 제공
- PrintStream
- PrintWriter
4) 텍스트 파일을 라인 단위로 읽는 메소드를 제공
- LineNumberReader
- 텍스트 파일을 라인 단위로 읽어 들이는 메소드 제공
- BufferedReader의 서브 클래스
- 주요 메소드 : String readLine(), int getLineNumber()
5) 바이트 스트림과 캐릭터 스트림의 호환
- InputStreamReader
- 바이트 입력 스트림을 캐릭터 입력 스트림으로 바꾸기 위한 클래스
- 바이트 단위로 읽은 후 문자로 바꾸어 처리함
- 생성자는 InputStreamReader(InputStream in)
- int read() : 1개 문자를 읽어 리턴함
- int read(char[] cbuf, int offset, int length) - OutputStreamWriter
-