I/O : Input & Output
스트림 : 데이터를 운반하는데 사용되는 연결통로
단방향 통신으로 입력과 출력을 동시에 하려면 입력스트림(input stream)과 출력스트림(ouput stream), 모두 2개의 스트림이 필요하다.
아래 표의 스트림들은 각각 InputStream, OutputStream의 자손들
입력스트림 | 출력스트림 | 입출력 대상의 종류 |
---|---|---|
FileOutputStream | 파일 | |
ByteArrayInputStream | ByteArrayOutputStream | 메모리(byte배열) |
PipedInputStream | PipedOutputStream | 프로세스(프로세스간의 통신) |
AudioInputStream | AudioOutputStream | 오디오장치 |
InputStream, OutputStream의 메서드
InputStream 메서드 | 설명 |
---|---|
int available() | 스트림으로부터 읽어 올 수 있는 데이터의 크기를 반환한다. |
void close() | 스트림을 닫음으로써 사용하고 있던 자원을 반환한다. |
void mark(int readlimit) | 현재위치를 표시해 놓는다. 후에 reset()에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다. readlimit은 되돌아갈 수 있는 byte의 수이다. |
boolean markSupported() | mark()와 reset()을 지원하는지를 알려준다. mark()와 reset() 기능 을 지원하는 것은 선택적이므로, mark()와 reset()을 사용하기 전에 markSupported()를 호출해서 지원여부를 확인해야한다. |
abstract int read() | 1 byte를 읽어 온다(0~255사이의 값). 더 이상 읽어 올 데이터가 없으면 -1을 반환한다. abstract메서드라서 InputStream의 자손들은 자신의 상 황에 알맞게 구현해야 한다. |
int read(byte[] b) | 배열 b의 크기만큼 읽어서 배열을 채우고 읽어 온 데이터의 수를 반환한 다. 반환하는 값은 항상 배열의 크기보다 작거나 같다. |
int read(byte[] b, int off, int len) | 최대 len개의 byte를 읽어서, 배열 b의 지정된 위치(off)로부터 저장한다. 실제로 읽어 올 수 있는 데이터가 len개보다 적을 수 있다. |
void reset() | 스트림에서의 위치를 마지막으로 mark()이 호출되었던 위치로 되돌린다. |
long skip(long n) | 스트림에서 주어진 길이(n)만큼을 건너뛴다. |
OutputStream 메서드 | 설명 |
---|---|
void close() | 입력소스를 닫음으로써 사용하고 있던 자원을 반환한다. |
void flush() | 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다. |
abstract void write(int b) | 주어진 값을 출력소스에 쓴다. |
void write(byte[] b) | 주어진 배열 b에 저장된 모든 내용을 출력소스에 쓴다. |
void write(byte[] b, inf off, int len) | 주어진 배열 b에 저장된 내용 중에서 off번째부터 len개 만큼만을 읽어서 출력소스에 쓴다. |
프로그램이 사용하지 않는 스트림을 JVM이 닫아주긴하지만, 사용하고 close()로 반드시 닫아줘야 한다. (단, 메모리를 사용하는 스트림과 System.in, System.out같은 표준 입출력 스트림은 안닫아도됨)
스트림을 이용해서 보조스트림을 만들어 기능을 추가하거나 성능을 향상시킬 수 있다.
입력 | 출력 | 설명 |
---|---|---|
FilterOutputStream | 필터를 이용한 입출력 처리 | |
버퍼를 이용한 입출력 성능향상 | ||
DataInputStream | DataOutputStream | int, float와 같은 기본형 단위로 데이터를 처리 |
없음 | 두 개의 스트림을 하나로 연결 | |
LineNumberInputStream | 없음 | 읽어 온 데이터의 라인 번호를 카운트(JDK1.1 부터 LineNumberReader로 대체 |
ObjectOutputStream | 데이터를 객체단위로 읽고 쓰는데 사용. 주로 파일을 이용하며 객체 직렬화와 관련있음 | |
없음 | 버퍼를 이용하며, 추가적인 print관련 기능 (print, printf, println메서드) | |
PushbackInputStream | 없음 | 버퍼를 이용해서 읽어 온 데이터를 다시 되돌 리는 기능(unread) |
// 기반 스트림 생성
FileInputStream fis = new FileInputStream("test.txt");
// 기반 스트림을 이용해 보조 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(); // 보조 스트림인 BufferedInputStream으로부터 데이터를 읽는다.
문자데이터를 입출력할때 이거쓰자
바이트기반 스트림 | 문자기반 스트림 |
---|---|
FileInputStream FileOutputStream | |
ByteArrayInputStream ByteArrayOutputStream | CharArrayReader CharArrayWriter |
PipedInputStream PipedOutputStream | PipedReader PipedWriter |
StringBufferInputStream(안씀) StringBufferOutputStream(안씀) |
메서드
Reader | Writer |
---|---|
int read() int read(char[] cbuf) abstract int read(char[], int off, int len) | void write(int c) void write(char[] cbuf) abstract void write(char[] cbuf, int off, int len) void write(String str) void write(String str, int off, int len) |
버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다. 버퍼를 이용하면 입출력의 효율이 비교할 수 없을 정도로 좋아지기 때문에 사용하는 것이 좋다.
바이트기반 스트림을 문자기반 스트림으로 연결시켜준다.
생성자/메서드 | 설명 |
---|---|
InputStreamReader(InputStream in) | OS에서 사용하는 기본 인코딩의 문자로 변환하는 Input StreamReader를 생성한다. |
InputStreamReader(InputStream in, String encoding) | 지정된 인코딩을 사용하는 InputStreamReader를 생성한다. |
String getEncoding() | InputStreamReader의 인코딩을 알려 준다. |
생성자/메서드 | 설명 |
---|---|
OutputStreamWriter(OutputStream in) | OS에서 사용하는 기본 인코딩의 문자로 변환하는 Output StreamWriter를 생성한다. |
OutputStreamWriter(OutputStream in, String encoding) | 지정된 인코딩을 사용하는 OutputStreamWriter를 생성한다. |
String getEncoding() | OutputStreamWriter의 인코딩을 알려 준다. |
System.in : 표준 출력(입력받는데 사용)
System.out : 표준 입력(출력하는데 사용)
System.err : 표준 입력(출력하는데 사용)
원래 System.in, System.out, System.err의 입출력대상은 콘솔 화면이지만, setIn(), setOut(), setErr()를 사용하면 대상변경가능
메서드 | 설명 |
---|---|
static void setOut(PrintStream out) | System.out의 출력을 지정된 PrintStream으로 변경 |
static void setErr(PrintStream err) | System.err의 출력을 지정한 PrintStream으로 변경 |
static void setIn(PrintStream in) | System.in의 출력을 지정한 PrintStream으로 변경 |
자바에서는 File클래스를 통해 파일과 디렉토리를 다룰 수 있도록 하고 있다.
생성자/메서드 | 설명 |
---|---|
File(String fileName) | 주어진 문자열(fileName)을 이름으로 갖는 파일을 위한 File인스턴스를 생성한다. 파일 뿐만 아니라 디렉토리도 같은 방법으로 다룬다. 여기서 fileName은 주로 경로(path)를 포함해서 지정해 주지만, 파일 이름만 사용해도 되는 데 이 경우 프로그램 이 실행되는 위치가 경로(path)로 간주된다. |
File(String pathName, String fileName) File(File pathName, String fileName) | 파일의 경로와 이름을 따로 분리해서 지정할 수 있게 한 생성자. 이 중 두 번째 것은 경로를 문자열이 아닌 File인 스턴스인 경우를 위해서 제공된 것이다. |
File(URI url) | 지정된 url로 파일을 생성 |
String getName() | 파일이름을 String으로 반환 |
String getPath() | 파일의 경로(path)를 String으로 반환 |
String getAbsolutePath() File getAbsoluteFile() | 파일의 절대경로를 String으로 반환 파일의 절대경로를 File로 반환 |
String getCanonicalPath() File getCanonicalFile() | 파일의 정규경로를 String으로 반환 파일의 정규경로를 File로 반환 |
멤버변수 | 설명 |
---|---|
static String pathSeparator | OS에서 사용하는 경로(path) 구분자, 윈도우 ";", 유닉스 ":" |
static char pathSeparatorChar | OS에서 사용하는 경로(path) 구분자. 윈도우에서는 ';', 유닉스':' |
static String separator | OS에서 사용하는 이름 구분자. 윈도우 "₩", 유닉스 "/" |
static char separatorChar | OS에서 사용하는 이름 구분자. 윈도우 '₩', 유닉스 '/' |
많이 사용되는 스트림 중의 하나
생성자 | 설명 |
---|---|
FileinputStream(String name) | 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileInputStream을 생성한다. |
FileInputSream(File file) | 파일의 이름이 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileInputStream(String name)와 같다. |
FileInputStream(FileDescriptor fdObj) | 파일 디스크립터(fdObj)로 FileInputStream을 생성한다. |
생성자 | 설명 |
---|---|
FileOutputStream(String name) | 지정된 파일이름(name)을 가진 실제 파일과 연결된 File OutputSream을 생성한다. |
FileOutputStream(String name, boolean append) | 지정된 파일이름(name)을 가진 실제 파일과 연결된 File OutputStream을 생성한다. 두번재 인자인 append를 true 로 하면, 출력 시 기존의 파일내용의 마지막에 덧붙인다. false 면, 기존의 파일내용을 덮어쓰게 된다. |
FileOutputStream(File file) | 파일의 이름을 String이 아닌 File인스턴스로 지정해주어야 하 는 점을 제외하고 FileOutputStream(String name)과 같다. |
FileOutputStream(File file, boolean append) | 파일의 이름을 String이 아닌 File인스턴스로 지정해주어 야 하는 점을 제외하고 FileOutputStream(String name, boolean append)과 같다. |
FileOutputStream(FileDescriptor fdObj) | 파일 디스크립터(fdObj)로 FileOutputStream을 생성한다. |
파일에 입출력을 하기 위한 스트림
생성자 | 설명 |
---|---|
FileInputStream(string name) | 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileInputStream을 생성한다. |
FileInputStream(File file) | 파일의 이름이 String이 아닌 File인스턴스로 지정해주어야 하는 점을 제외하고 FileInputStream(String name)와 같다. |
FileInputStream(FileDescriptor fdObj) | 파일 디스크립터(fdObj)로 FileInputStream을 생성한다. |
생성자 | 설명 |
---|---|
FileOutputStream(String name) | 지정된 파일이름(name)을 가진 실제 파일과 연결된 File OutputStream을 생성한다. |
FileOutputStream(String name, boolean append) | 지정된 파일이름(name)을 가진 실제 파일과 연결된 File OutputStream을 생성한다. 두번째 인자인 append를 true 로 하면, 출력 시 기존의 파일내용의 마지막에 덧붙인다. false 면, 기존의 파일내용을 덮어쓰게 된다. |
FileOutputStream(File file) | 파일의 이름을 String이 아닌 File인스턴스로 지정해주어야 하 는 점을 제외하고 FileOutputStream(String name)과 같다. |
FileOutputStream(File file, boolean append) | 파일의 이름을 String이 아닌 File인스턴스로 지정해주어 야 하는 점을 제외하고 FileOutputStream(String name, boolean append)과 같다. |
FileOutputStream(FileDescriptor fdObj) | 파일 디스크립터(fdObj)로 FileOutputStream을 생성한다. |
Ex15_5.java -> Ex15_5 -> Ex15_5.bak
FilterInputStream/FilterOutputStream 은 InputStream/OutputStream의 자손
생성자 오버라이딩 해야됨
public class FilterInputStream extends InputStream {
protexted volatile InputStream in;
protexted FilterInputStream(InputStream int) {
this.in = in;
}
public int read() throws IOException {
return in.read();
}
...
}
FilterInputStream의 자손 - BufferedInputStream, DataInputStream, PushbackInputStream 등
Out도 동일
버퍼를 이용해서 한번에 여러 바이트를 입출력하기 때문에 대부분의 입출력 작업에 사용.
생성자 | 설명 |
---|---|
BufferedInputStream(InputStream in, int size) | 주어진 InputStream인스턴스를 입력소스(input source)로하며 지정된 크기(byte단위)의 버퍼를 갖는 BufferedInputStream인스턴스를 생성한다. |
메서드/생성자 | 설명 |
---|---|
BufferedOutputStream(OutputStreamout, int size) | 주어진 OutputStream인스턴스를 출력소스(output source)로하며 지정된 크기(단위byte)의 버퍼를 갖는 BufferedOutputStream인스턴스를 생성한다. |
BufferedOutputStream(OutputStreamout) | 주어진 OutputStream인스턴스를 출력소스(output source)로하며 버퍼의 크기를 지정해주지 않으므로 기본적 으로 8192 byte 크기의 버퍼를 갖게 된다. |
flush() | 버퍼의 모든 내용을 출력소스에 출력한 다음, 버퍼를 비운다. |
close() | flush()를 호출해서 버퍼의 모든 내용을 출력소스에 출력하고, BufferedOutputStream인스턴스가 사용하던 모든 자원을 반환한다. |
여러개의 입력스트림을 연속적으로 연걸해서 하나의 스트림으로부터 데이터를 읽는 것과 같이 처리.
생성자 | 설명 |
---|---|
SequenceInputStream(Enumeration e) | Enumeration에 저장된 순서대로 입력스팀을 하나의 스트림으로 연결한다. |
SequenceInputStream(InputStream s1, InputStream s2) | 두 개의 입력스트림 s1, s2를 하나로 연결한다. |
[ex 1]
Vector files = new Vector();
files.add(new FileInputStream("file.001"));
files.add(new FileInputStream("file.002"));
SequenceInputStream in = new SequenceInputStream(files.elements());
[ex 2]
FileInputStream file1 = new FileInputStream("file.001");
FileInputStream file2 = new FileInputStream("file.002");
SequenceInputStream in = new SequenceInputStream(file1, file2)
진짜 메서드 왤케 많
생성자/메서드 | 설명 |
---|---|
PrintStream(File file) PrintStream(File file, String csn) PrintStream(OutputStream out) PrintStream(OutputStream out, boolean autoFlush) PrintStream(OutputStream out, boolean autoFlush, String encoding PrintStream(String fileName) PrintStream(String fileName, String csn) | 지정된 출력스트림을 기반으로 하는 PrintStream인 스턴스를 생성한다. autoFlush의 값을 true로 하면 printin메서드가 호출되거나 개행문자가 출력될 때 자동으로 flush된다. 기본값을 false이다. |
boolean checkerror() | 스트림을 flush하고 에러가 발생했는지를 알려 준다. |
void print(boolean b) void print(char c) void print(char[] c) void print(double d) void print(float f) void print(int i) void print(long l) void print(Object o) void print(String s) | 인자로 주어진 값을 출력소스에 문자로 출력한다. println메서드는 출력 후 줄바꿈을 하고, print에서는 줄을 바꾸지 않는다. |
void println() | 줄바꿈 문자를 출력함으로써 줄을 바꾼다. |
PrintStream printf(String format, Object... args) | 정형화된 출력을 가능하게 한다. |
protected void setError() | 작업 중에 오류가 발생했음을 알린다. (setError()를 호출한 후에, checkError()를 호출하면 true를 반환한다.) |
메서드 | 설명 |
---|---|
abstract void close() | 입력스트림을 닫음으로써 사용하고 있던 자원을 반환한다. |
void mark(int readlimit) | 현재위치를 표시해놓는다. 후에 result()에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다. |
boolean markSupported() | mark()와 reset()을 지원하는지를 알려 준다. |
int read() | 입력소스로부터 하나의 문자를 읽어 온다. char의 범위인 0~65535의 정 수를 반환하며, 입력스트림의 마지막 데이터에 도달하면, -1을 반환한다. |
abstract int read(char[] c, int off, int len) | 입력소스로부터 최대 len개의 문자를 읽어서, 배열 c의 지정된 위치(off)부터 읽은 만큼 저 장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다. |
int read(CharBuffer target) | 입력소스로부터 읽어서 문자버퍼(target)에 저장한다. |
boolean ready() | 입력소스로부터 데이터를 읽을 준비가 되어있는지 알려준다. |
void reset() | 입력소스에서의 위치를 마지막으로 mark()가 호출되었떤 위치로 되돌린다. |
long skip(long n) | 현재 위치에서 주어진 문자 수 (n)만큼을 건너뛴다. |
메서드 | 설명 |
---|---|
Writer append(char c) | 지정된 문자를 출력소스에 출력한다. |
Writer append(CharSequence c) | 지정된 문자열(CharSequence)을 출력소스에 출력한다. |
Writer append(CharSequence c, int start, int end) | 지정된 문자열의 일부를 출력소스에 출력 |
abstract void close() | 출력스트림을 닫음으로써 사용하고 있던 자원을 반납한다. |
abstract void flush() | 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다. |
void write(int b) | 주어진 값을 출력소스에 쓴다. |
void write(char[] c) | 주어진 배열 c에 저장된 모든 내용을 출력소스에 쓴다. |
abstract void write(char[] c, int off, int len) | 주어진 배열 c에 저장된 내용 중에서 off번째부터 len길이만큼만 출력소스에 쓴다. |
void write(String str) | 주어진 문자열(str)을 출력소스에 쓴다. |
void write(String str, int off, int len) | 주어진 문자열(str)의 일부를 출력소스에 쓴다.(off번째 문자부터 len개 만큼의 문자열) |
FileInputStream은 한글이 깨지고 FileReader은 안깨진다.
StringBuffer getBuffer()
StringWriter에 출력한 데이터가 저장된 StringBuffer를 반환한다.String toString()
StringBuffer에 저장된 문자열을 반환한다.
객체를 데이터 스트림으로 만드는 것
ObjectOutputStream - 직렬화
FileOutputStream fos = new FileOutputStream("objectfile.ser"); ObjectOutputStream out = new ObjectOutputStream(fos); // objectfile.ser 파일에 UserInfo객체를 직렬화하여 저장한다. out.writeObject(new UserInfo());
ObjectInputStream - 역직렬화
FileInputStream fis = new FileInputStream("objectfile.ser"); ObjectInputStream in = new ObjectInputStream(fis); //readObject()를 사용하여 저장된 데이터를 읽기만 하면 객체로 역직렬화 UserInfo info = (UserInfo)in.readObject();
ObjectInputStream | ObjectOutputStream |
---|---|
void defaultReadObject() int read() int read(byte[] buf, int off, int len) boolean readBoolean() byte readByte() char readChar() double readDouble() float readFloat() int readInt() long readLong() short readshort() Object readObject() int readUnsignedbyte() int readUnsignedShort() Object readUnshared() String readUTF() | void defaultWriteObject() void write(byte[] buf) void write(byte[] buf, int off, int len) void write(int val) void writeBoolean(boolean val) void writeByte(int val) void writeBytes(String str) void writeChar(int val) void writeChars(String str) void writeDouble(double val) void writeFloat(float val) void writeInt(int val) void writeLong(long val) void writeObject(Object obj) void writeShort(int val) void writeUnshared(Object obj) void writeUTF(String str) |
defaultReadObject()와 defaultWriteObject()는 자동 직렬화이다.
public interface Serializable {}
public class UserInfo implements Serializable { // 직렬화됨.
String name;
String password;
int age;
}
// 조상인 UserInfo가 Serializable을 구현했으므로 직렬화가능
public class SuperUser extends UserInfo {
int age;
}
---
public class UserInfo {
String name; // 직렬화 대상에서 제외됨.
String password; // 직렬화 대상에서 제외됨.
int age; // 직렬화 대상에서 제외됨.
}
public class SuperUser extends Serializable {
int age;
}
transient 붙이면 제외됨.
public class UserInfo implements Serializable {
String name;
transient String password; // 직렬화 대상에서 제외됨.
int age;
transient Object obj = new Object(); // 직렬화 대상에서 제외됨.
}