바이트 지향 스트림 클래스
- java.io.InputStream / 스트림들을 관리하기 위한 정보 제공
스트림으로 부터 데이터 읽기, 스트림을 새로운 위치로 내보내기, 스트림 닫기
- java.io.OutputStream /스트림에 데이터 기록, 대상에게 스트림으로 데이터 내보내기, 스트림 닫기
java.io.InputStream에서 제공하는 메소드 |
int available() : 입력 스트림으로부터 읽은 수 있는 바이트 수를 반환한다. |
void close() : 입력 스트림을 받고 스트림과 연관된 시스템 자원을 해제한다. |
void mark(int readlimit) : 입력 스트림에 현재 위치를 표시한다. |
boolean markSupported() : 입력 스트림이 mark와 reset 메소드를 제공하는지 테스트한다. |
abstract int read() : 입력 스트림으로부터 다음 바이트를 읽는다. |
int read(byte[] b) : 입력 스트림으로부터 약간의 바이트 수를 읽고 그것을 버퍼 배열인 b에 저장 |
int read(byte[] b, int off, int len) : 입력 스트림으로부터 len으로 지정된 바이트를 읽어서 배열 b에 저장 |
void reset() : mark 메소드로 입력 스트림을 마지막으로 호출한 시간에 이 스트림을 재설정한다. |
long skip(long n) : 입력 스트림으로부터 n개의 바이트 데이터를 건너뛰고 버린다. |
java.io.OutputStream에서 제공하는 메소드 |
void close() : 출력 스트림을 닫고 스트림과 연관된 어떠한 시스템 자원을 해제 |
void flush() : 출력 스트림을 내보내고 버퍼에 저장된 출력 바이트들을 출력 |
void write(byte[] b) : 지정된 바이트 배열에서 출력 스트림으로 배열 b의 길이만큼 출력 |
void write(byte[] b, int off, int len) : 지정된 바이트의 offset위치에서부터 출력 스트림으로 len바이트를 출력 |
abstract void write(int b) : 출력 스트림으로 지정된 바이트를 출력한다. |
*자료를 읽고, 쓰는 대상과 자료형을 살펴야 한다.
*계층도
Object ┌ InputStream ┌ ByteArrayInputStream
│ ├ FileInputStream
│ ├ FilterInputStream -----------┬ BufferedInputStream
│ ├ ObjectInputStream └ DataInputStream
│ ├ PipedInputStream
│ ├ SequentialInputStream
│ └ StringBufferInputStream
│
└ OutputStream ┌ ByteArrayOutputStream
├ FileOutputStream ┌ BufferedOutputStream
├ FilterOutputStream ---------┼ DataOutputStream
├ PipedInputStream └ PrintStream
└ ObjectOutputStream
* FilterStream
- 필터스트림의 생성자에 출력 스트림을 전달한다.-> 출력 스트림 대신에 필터 스트림을 사용할 수 있다.
- 원본 스트림의 메소드 대신에 필터 스트림의 메소드를 사용 가능하게 한다.
BufferedInputStream : 많은 데이터를 버퍼로 읽을 수 있는 입력 연산 제공, 작은 단위도 가능 |
BufferedOutputStream : 버퍼에 작은양을 저장할수 있는 버퍼 출력연산 제공, 준비되면 비운다. |
DataInputStream : 2진 데이터를 읽을수 있게 허용. double형이면 8바이트로 읽고 스스로 생성해야 한다. |
DataOutputStream : 2진 데이터를 기록할 수 있도록 허용한다. |
PushbackInputStream : 빈 입력 스트림에서 다음 바이트를 볼수 있는 1바이트의 pushback버퍼를 유지한다. 데이터의 다음 섹션을 다루는 또 다른 처리에 스트림을 넘긴다. |
PrintStream : 데이터 출력을 위한 메소드 제공, (print()/println()) |
*파일 입출력
+ 주요 클래스
-+ FileInputStream : 순차적으로 파일로부터 데이터를 읽기 위해 InputStream인터페이스를 제공
-+ FileOutputStream : 순차적으로 파일에 데이터를 기록하기 위한 OutputStream인터페이스 제공
-+ RandomAccessFile : java.io.RandomAccessFile클래스는 임의의 위치에서 읽을 수 있다.
----+ 파일의 특정한 위치로 자유롭게 옮겨다니면서 읽을수 있다.
----+ 한개의 클래스 내에 입출력을 모두 제공한다.
----+ 메소드
-------+ long getFilePointer() : 파일포인터의 현재 위치를 반환
-------+ long length() : 파일의 크기를 반환
-------+ seek(long pos) : 지정된 위치로 파일 포인터를 이동(파일의 시작위치를 기준)
----+ 생성자
-------+ RandomAccessFile(File file, String mode)
-------+ RandomAccessFile(String name, String mode)
-+ File 클래스 : java.io.File클래스는 파일에 대한 정보를 제공한다.
----+ 파일삭제 / 파일이름 변경 / 디렉토리 생성
----+ 파일 분리 문자 ; 윈도우 : 역슬래시(\) / Unix : 슬래시(/)
----+ 메소드
-------+ listFiles() : java.io.File 객체의 배열을 반환한다.
-------+ list() : 디렉토리에 있는 파일들의 파일 이름을 포함한 String 객체의 배열을 반환한다.
*
//파일분리문자를 생성자에 전달하여 새로운 파일을 생성한다.
import java.io.File;
public class FileDirectory {
public static void main(String[] args) {
try {
File f = new File(File.separator);
if(f.isDirectory()) { //디렉토리임을 점검 > 참값을 갖게 되면 listFiles()메소드를 호출한다
File[] files = f.listFiles(); //디렉토리에 모든 파일을 목록에 나열
for(int i=0; i<files.length; i++) {
if(files[i].isDirectory()) {
System.out.println("<dir> " + files[i].getName());
}
else {
System.out.println(files[i].getName());
}
}
}
}
catch(Exception e) {
e.printStackTrace(); //배열리턴
}
}
}
*
* 그 외
ByteArrayInputStream : InputStream객체인것처럼 바이트의 배열을 읽는다.
SequenceInputStream : 두개 또는 더 많은 InputStream객체들로부터 데이터를 연결
PipedInputStream : thread 사이의 통신을 위해 사용
ByteArrayOutputStream : 바이트[] 객체로 출력을 내보낸다
PipedOutputStream : thread 통신을 연결하기 위해 PipedInputStream과 통신한다.
문자 지향 스트림 클래스
- java.io.Reader
- java.io.Write
Object ┬ Reader┬ FileReader : 바이트 지향의 FileInputStream과 동일
│ ├ FileWriter : 바이트 지향의 FileOutputStream과 동일
│ ├ InputStreamReader : InputStream 객체를 Reader로 변환
│ ├ OutputReader : OutputStream 객체를 Writer로 변환
│ ├ BufferedReader : 효율성을 위해 버퍼를 사용하는 Reader
│ ├ CharArrayReader : Reader 객체로서 문자 배열을 읽는다.
│ ├ StringReader : Reader 객체로서 String을 읽는다.
│ └ PipedReader : thread 사이의 통신을 위해 사용
│
└ Write ┬ BufferedWriter : 효율성을 위해 버퍼를 사용하는 Writer
├ CharArrayWriter : 문자배열 char[]에 출력(기록)
├ StringWriter : Writer 객체로서 StringBuffer에 기록
│ String에 Writer를 기록
├ PipedWriter : 스레드 통신의 다른 절반이다.
└ PrintWriter : 바이트 지향의 PrintStream과 같다.
Reader 메소드 : 문자읽기, 건너뛰기, 스트림으로 뛰어 넘을수 있는 마크 설정, Reader 닫기 |
abstract void close() : 스트림 닫기 |
void mark(intreadAheadLimit) : 스트림에서 현재위치 표시 |
boolean markSupported() : 스트림이 mark() 연산을 제공하는지 검사 |
int read() : 단일 문자를 읽는다. |
int read(char[] cbuf) : 배열로 문자들을 읽는다. |
abstract int read(char[] cbuf, int off, int len) : 배열의 일부분으로 문자들을 읽는다. |
boolean ready() : 스트림이 읽을 준비가 되었는지 검사 |
void reset() : 스트림 재설정 |
long skip(long n) : 문자를 건너뛴다. |
Writer 메소드 : 스트림에 데이터 기록, 스트림으로 쓰여진 데이터 비우기, 스트림 닫기 |
abstract void close() : 스트림 닫기 |
abstract void flush() : 스트림 플러쉬 |
void write(char[] cbuf) : 문자 배열을 기록한다. |
abstract void write(char[] cbuf, int off, int len) : 문자 배열의 일부를 기록한다. |
void write(int c) : 단일 문자를 기록 |
void write(String str) : 문자열 기록 |
void write(String str, int off, int len) : 문자열의 일부를 기록 |
* Reader/Writer 를 사용하는 파일 입출력
┌ java.io.FileReader
└ java.io.FileWriter -FileInputStream과 FileOutputStream 클래스에 거의 동등하게 사용
*
//Reader와 Writer를 기반클래스로 해서 FileReader와 FileWriter 인스턴스를 읽고 쓴다.
import java.io.Reader;
import java.io.Writer;
import java.io.FileReader;
import java.io.FileWriter;
public class FileReaderWriterEx {
public static void main(String[] args) {
try {
Reader r = new FileReader("in.txt");
Writer w = new FileWriter("out.txt");
int c;
while((c = r.read()) != -1) {
System.out.print((char)c);
w.wait(c);
}
r.close();
w.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
*
* 바이트와 문자 입출력 클래스
- java는 Reader로 읽는 입력 스트림 클래스와 Writer로 쓰는 출력 스트림 클래스를 위한 도움 클래스를 제공한다.
┌ java.io.InputStreamReader
└ java.io.OutputStreamWriter
* StreamTokenizer - java.io.StreamTokenizer
- 토큰으로 나눔으로써 Reader를 분석하도록 도와주는 유틸리티 클래스
- Reader로부터 반환된 각각의 화이트 문자로 분리된 문자열을 요청할수 있다.
- 단어단위로 반환하는 것으로 생각할 수 있다.
- Reader 에 끝이 있다면 차례로 반환상태를 토큰으로 분석하고
StreamTokenizer클래스의 public속성으로 유효한 값을 만든다.