[JAVA] 패키지와 스트림
입출력 스트림
- Java 프로그램에서 입출력을 수행하기 위한 스트림
- 입력 스트림은 데이터 생산자(소스)와 프로그램을 연결
- 출력 스트림은 프로그램과 소비자(목적지)를 연결
- 입출력 종류(파일, 주변 장치, 네트워크 소켓 등)에 상관없이 동일한 방법으로 프로그램 작성
- 입출력 스트림 클래스는 java.io 패키지에서 제공함
스트림의 정의와 특성
- 데이터 생산자/소비자와 프로그램 사이의 데이터 흐름
- 순서가 있는 일련의 데이터 흐름으로, 정해진 방향으로 전달되며 순차적으로 접근 가능
스트림의 분류
바이트 스트림과 캐릭터 스트림
- 바이트 스트림
- byte 단위로 데이터를 다룸
- 관련 클래스: ~InputStream, ~OutputStream
- 캐릭터 스트림
- char 단위로 데이터를 다룸
- 관련 클래스: ~Reader, ~Writer
기본 스트림과 보조 스트림
- 기본 스트림
- 기본 입출력 기능을 제공하는 스트림
- 보조 스트림
- 자체적으로 입출력 기능을 수행할 수 없으며, 기본 스트림과 함께 사용되어 보조 기능을 제공하는 스트림
- 기본 스트림 객체를 먼저 생성하고, 기본 스트림을 인자로 사용하여 보조 스트림 객체를 생성함
1
2
FileInputStream fis = new FileInputStream("text.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
스트림 관련 클래스
입력 스트림 | 출력 스트림 | ||
---|---|---|---|
기본 스트림 | 바이트 스트림 | InputStream FileInputStream ByteArrayInputStream | OutputStream FileOuputStream ByteArrayOuputStream |
문자 스트림 | Reader FileReader CharArrayReader StringReader | Writer FileWriter CharArrayWriter StringWriter | |
보조 스트림 | 바이트 스트림 | BufferedInputStream DataInputStream ObjectInputStream | BufferedOutputStream DataOutputStream ObjectOutputStream PrintStream |
문자 스트림 | BufferedReader | BufferedWriter PrintWriter | |
기타 스트림 | InputStreamReader | OutputStreamWriter |
바이트 스트림과 캐릭터 스트림
InputSream 클래스
- 바이트 단위 입력 스트림 클래스 중 최상위 추상 클래스
- 하위 클래스는 ~InputStream
메소드 | 설명 |
---|---|
abstract int read() | 입력 스트림으로부터 1 바이트를 읽어 정수로 리턴함 |
int read(byte[] b) | 입력 스트림으로부터 읽어서 byte 배열에 저장하고 읽은 바이트 개수를 리턴함 |
int read(byte[] b, int off, int len) | 입력 스트림으로부터 len 바이트를 읽어서 바이트 배열의 off 위치부터 저장하고 읽은 바이트 개수를 리턴함 |
int available() | 다음 read()할 때, 블로킹 없이 입력 스트림에서 읽을 수 있는 바이트 단위의 데이터 길이를 리턴함 |
long skip(long n) | 입력 스트림에서 n 바이트를 건너뛰고 건너뛴 문자 수를 리턴함 |
void mark(int readlimit) | 입력 스트림에서 현재 위치를 표시함 |
void reset() | mark()에서 표시된 위치로 스트림의 현재 위치를 이동 |
OutputStream 클래스
- 바이트 단위 출력 스트림 클래스 중 최상위 추상 클래스
- 하위 클래스는 ~OutputStream
메소드 | 설명 |
---|---|
abstract void write(int b) | 1byte 데이터를 출력 스트림에 씀 |
void write(byte[] b) | byte형 배열 b의 모든 바이트를 출력 스트림에 씀 |
void write(byte[] b, int off, int len) | byte형 배열 b의 off 위치부터 len 바이트를 출력 스트림에 씀 |
void close() | 출력 스트림을 닫고 자원을 돌려줌 |
void flush() | 출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄 |
Reader 클래스
- 캐릭터 단위 입력 스트림 클래스 중 최상위 추상 클래스
- 하위 클래스는 ~Reader
메소드 | 설명 |
---|---|
int read() | 입력 스트림에서 1개 문자(2바이트)를 읽어 리턴함 |
int read(char[] cbuf) | 입력 스트림에서 문자들을 읽어 char형 배열 cbuf에 저장하고, 읽은 문자의 개수를 리턴함 |
boolean ready() | 입력 스트림에 입력 데이터가 준비되었으면 true를 리턴함 |
abstract void close() | 입력 스트림을 닫고 자원을 반환함 |
Writer 클래스
- 캐릭터 단위 출력 스트림 클래스 중 최상위 추상 클래스
- 하위 클래스는 ~Writer
메소드 | 설명 |
---|---|
void write(int c) | 1개 문자(2바이트)를 출력 스트림에 씀 |
void write(char[] cbuf) | char형 배열 cbuf의 모든 문자를 출력 스트림에 씀 |
void write(String str) | 문자열 str을 출력 스트림에 씀 |
void write(String str, int off, int len) | 문자열 str의 off 위치부터 len개의 문자를 출력 스트림에 씀 |
abstract void close() | 출력 스트림을 닫고 자원을 반환함 |
void flush() | 출력 스트림에 남아 있는 모든 데이터를 최종 목적지로 보냄 |
파일 입출력
File 클래스
- 파일이나 디렉터리를 표현하는 클래스
- 파일이나 디렉터리의 정보 조회 또는 조작 기능을 제공
- 이름과 경로 조회
- 파일과 디렉터리의 생성 및 삭제
- 입출력 메소드는 제공되지 않음
- 생성자
new File(String pathname)
- pathname은 상대 경로 또는 절대 경로
1
2
File myFile1 = new File("D:\\eclipse\\workspace\\Text\\src");
File myFile2 = new File("notepad.exe");
메소드 | 설명 |
---|---|
boolean exists() | File 객체로 표현된 것이 실제 파일 또는 디렉터리로 존재하는지 여부 |
boolean isDirectory() | File 객체에 지정된 경로가 디렉터리인지 여부 |
boolean isFile() | File 객체에 지정된 경로가 파일인지 여부 |
String getName() | 파일 또는 디렉터리의 이름을 리턴함 |
String getPath() | 경로 전체를 리턴함 |
long length() | 파일인 경우, 크기를 바이트 단위로 리턴함 |
boolean createNewFile() | File 객체에 지정된 파일을 생성함 |
boolean delete() | File 객체에 지정된 파일이나 (비어있는 디렉터리인 경우) 디렉터리를 삭제함 |
boolean mkdir() | File 객체에 지정된 것을 디렉터리로 만듦 맨 마지막 디렉터리만 생성할 수 있음 |
boolean mkdirs() | 위와 같으나 지정된 경로상의 모든 필요한 디렉터리를 생성 |
String[] list() | File 객체에 지정된 디렉터리 안에 포함된 파일과 디렉터리의 이름을 문자열 배열로 리턴함 |
File[] listFiles() | 위와 같으나 File 객체의 배열로 리턴함 |
String getParent() | 상위 디렉터리 이름을 문자열로 리턴함 |
File getParentFile() | 상위 디렉터리를 File 객체로 리턴함 |
static File[] listRoots() | 파일 시스템에 존재하는 루트 디렉터리를 File 객체의 배열로 리턴함 |
예제: 디렉터리 내용 보기
1
2
3
4
5
6
7
8
File file = new File("c:\\windows");
File files[] = file.listFiles();
int i = 0;
while (i < files.length) {
System.out.print(files[i].getPath());
System.out.println("\t" + files[i].length);
i++;
}
RandomAccessFile 클래스
- 파일 포인터가 가리키는 임의의 위치에 읽기/쓰기 가능
- byte 단위로 읽고 쓰며, 읽거나 쓸 때 파일 포인터가 이동함
- 랜덤 액세스 파일을 byte 배열로 볼 수 있음
- 생성자
RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
- mode는 읽기 전용의 “r” 또는 읽기/쓰기의 “rw”
메소드 | 설명 |
---|---|
int read() | 파일로부터 1 바이트를 읽어 정수로 리턴함 |
int read(byte[] b) | 파일로부터 읽어서 byte 배열에 저장하고 읽은 바이트 개수를 리턴함 |
int read(byte[] b, int off, int len) | 파일로부터 len 바이트를 읽어서 바이트 배열의 off 위치부터 저장하고 읽은 바이트 개수를 리턴함 |
void seek(long pos) | pos에 지정된 위촐 파일 포인터를 이동함 |
void write(byte[] b) | byte 배열의 내용을 파일에 씀 |
void write(byte[] b, int off, int len) | byte 배열에서 off 위치부터 len 바이트를 파일에 씀 |
예제: RandomAccessFile 클래스를 이용하여 파일 쓰고 읽기
1
2
3
4
5
6
7
8
9
10
11
try (RandomAccessFile raf = new RandomAccessFile("c:\\java\\text.tsx", "rw")) {
for (int i = 0; i < 10; i++)
raf.write(i);
for (int i = 9; i >= 0; i--) {
raf.seek(i);
System.out.print(raf.read());
}
raf.close();
} catch (Exception e) {
System.out.println(e);
}
FileInputStream과 FileOutputStream 클래스
- byte 단위로 파일을 읽기/쓰기 위한 입출력용 기본 스트림
- 바이트 단위의 입출력을 처리하므로 이미지나 오디오 파일 같은 이진 파일을 다룰 때 유용함
- FileInputStream 클래스의 생성자
FileInputStream(String name)
FileInputStream(File file)
- FileOutputStream 클래스의 생성자
FileOutputStream(String name)
FileOutputStream(File file, boolean append)
예제: FileInputStream과 FileOutputStream 클래스 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
File inFile = new File("c:\\Java\\Main.java");
File outFile = new File("c:\\Java\\FileTemp.java");
try (InputStream is = new FileInputStream(inFile);
OutputStream os = new FileOutputStream(outFile)) {
int nData;
nData = is.read();
while (nData != -1) {
os.write(nData);
nData = is.read();
}
} catch (Exception e) {
System.out.println(e);
}
FileReader와 FileWriter 클래스
- char 단위로 파일을 읽거나 쓰기 위한 입출력용 기본 스트림
- 문자 단위의 입출력을 처리하므로 텍스트 파일을 다룰 때 유용함
- FileReader 클래스의 생성자
FileReader(String fileName)
FileReader(File file)
- FileWriter 클래스의 생성자
FileWriter(String fileName)
FileWriter(File file)
FileWriter(File file, boolean append)
콘솔 입출력 스트림
Console 클래스
- 콘솔 입출력을 제공하는 클래스
- 키보드 입력과 화면 출력을 지원
- 명령 프롬프트 창과 같은 콘솔 환경에서 사용자와의 상호작용을 지원
System.console()
을 사용하여 콘솔 객체를 생성함
메소드 | 설명 |
---|---|
String readLine() | 콘솔에서 한 라인을 읽어 리턴함 |
char[] readPassword() | 콘솔에서 비밀번호를 읽어 리턴함 |
PrintWriter writer() | 콘솔과 연결된 PrintWriter 객체를 리턴함 |
Reader reader() | 콘솔과 연결된 Reader 객체를 리턴함 |
예제: Console 클래스를 이용한 입출력
1
2
3
4
5
6
7
8
9
10
11
String name;
char[] pw;
Console con = System.console();
System.out.print("name: ");
name = con.readLine();
System.out.print("password: ");
pw = con.readPassword();
con.printf("name: %s\n", name);
con.printf("password: %s\n", new String(pw));
보조 스트림
- 기본 스트림의 성능이나 편의성을 높이는 보조 기능을 제공하는 스트림
- 입출력 기능은 기본 스트림을 이용해야 함
- 기본 스트림 객체를 먼저 생성하고, 이것을 보조 스트림 객체 생성자의 인자로 이용함
- 기본 스트림을 보조 스트림으로 감싼다고 표현함
- 프로그램에서는 보조 스트림 객체를 이용하여 입출력하면 됨
보조 스트림의 종류
- 버퍼링 기능
- BufferedInputStream, BufferedOutputStream
- BufferedReader, BufferedWriter
- Java의 기본 자료형을 그대로 읽기/쓰기 위한 기능
- DataInputStream, DataOutputStream
- 다양한 출력 형식 제공
- PrintStream, PrintWriter
- 텍스트 파일을 라인 단위로 읽거나 라인 번호를 관리하는 메소드 제공
- LineNumberReader
- 바이트 스트림과 캐릭터 스트림의 호환
- InputStreamReader, OutputStreamWriter
LineNumberReader 클래스
- 텍스트 파일을 라인 단위로 읽는 메소드 제공
- BufferedReader의 서브 클래스
메소드 | 설명 |
---|---|
int read() | 입력 스트림으로부터 1개 문자(2바이트)를 리턴함 개행 문자(\n)를 만나면 라인 번호를 증가시킴 |
String readLine() | 입력 스트림으로부터 한 라인을 읽어 리턴하고 라인 번호를 증가시킴 |
int getLineNumber() | 현재 라인의 번호를 리턴함 |
long skip(long n) | 입력 스트림에서 n개의 문자를 건너뛰고 건너뛴 문자 수를 리턴함 |
InputStreamReader 클래스
- 바이트 입력 스트림을 캐릭터 입력 스트림으로 변환해 주는 클래스
- 특정 문자 인코딩을 사용하여 변환할 수 있음
- 생성자
InputStreamReader(InputStream in, Charset cs)
1
2
3
4
5
6
7
try (InputStreamReader isr = new InputStreamReader(System.in, "euc-kr")) {
while ((i = isr.read()) != '끝') {
System.out.print((char) i);
}
} catch (Exception e) {
System.out.println(e);
}
This post is licensed under CC BY 4.0 by the author.