표준 입출력 스트림
System 클래스의 표준 입출력 멤버
public class System {
public static PrintStream out;
public static InputStream in;
public static PrintStream err;
}
- 이제까지 사용했던 System.out.println에서 System이라는 클래스 안에 static 변수로 선언된 out을 사용한 것이다.
- System.out → 표준 출력(모니터) 스트림
- System.in → 표준 입력(키보드) 스트림
- System.err → 표준 에러 출력(모니터) 스트림
System.in 사용 예제
import java.io.IOException;
public class SystemInTest11 {
public static void main(String[] args) {
System.out.println("알파벳 여러 개를 쓰고 [Enter]를 누르세요.");
int i;
try {
//엔터를 누를 때까지 적힌 문자를 읽음
while((i = System.in.read()) != '\n') {
System.out.print((char)i); //int로 반환된 i를 다시 문자로 반환
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- System.in.read( )는 한 byte씩 읽음
- read( )는 int로 반환 → char로 선언되게 형 변환
- 한 바이트씩 읽기 때문에 한글 같은 경우에는 문자가 깨짐.
한글이 깨지지 않고 제대로 출력이 되려면..
보조 스트림으로 감싸야한다.
try {
InputStreamReader irs = new InputStreamReader(System.in);
while((i = irs.read()) != '\n') {
System.out.print((char)i); //int로 반환된 i를 다시 문자로 반환
}
위 소스처럼 감싸준다.
- InputStreamReader는 바이트를 문자로 바꿔주는 클래스
- 매개변수로 다른 input stream을 받음
바이트 단위 입출력 스트림
InputStream
- 바이트 단위 입력 스트림 최상위 추상 클래스
- 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현
주요 하위 클래스
FileInputStream : 파일에서 바이트 단위로 자료를 읽음
ByteArrayInputStream : byte 배열 메모리에서 바이트 단위로 자료를 읽음
FilterInputStream : 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 최상위 클래스
주요 메서드
int read( ) : 입력 스트림으로부터 한 바이트의 자료를 읽음. 읽은 자료의 바이트 수를 반환
int read(byte b [ ]) : 입력 스트림으로부터 b[ ] 크기의 자료를 b[ ]에 읽음. 읽은 자료의 바이트 수를 반환
int read(byte b[ ], int off, int len) : 입력 스트림으로부터 b[ ] 크기의 자료를 b[ ]의 off 변수 위치부터 저장하면 len만큼 읽음. 읽은 자료의 바이트 수를 반환
void close( ) : 입력 스트림과 연결된 대상 리소스를 닫음.
※ 스트림은 반드시 close를 해주어야 한다.
표준 입출력(System)은 close를 안 함
FileInputStream 예제
① 파일에서 한 바이트씩 자료 읽기
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest1 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("input.txt");
System.out.println((char)fis.read());
System.out.println((char)fis.read());
System.out.println((char)fis.read());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e2) {
System.out.println(e2);
}
}
System.out.println("end");
}
}
② 파일의 끝까지 한 바이트씩 자료 읽기
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest2 {
public static void main(String[] args) {
int i;
try(FileInputStream fis = new FileInputStream("input.txt")) {
while( (i = fis.read()) != -1) {
System.out.print((char)i);
}
} catch(IOException e) {
}
}
}
③ 파일에서 바이트 배열로 자료 읽기
배열에 남아 있는 자료가 있을 수 있음에 유의
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest3 {
public static void main(String[] args) {
int i;
try(FileInputStream fis = new FileInputStream("input2.txt")) {
byte[] bs = new byte[10];
while( (i = fis.read(bs)) != -1) {
for(byte ch : bs) {
System.out.print((char)ch);
}
System.out.println(" : " + i + "바이트 읽음");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 마지막 자료에서 바이트 수는 6바이트이나 출력은 UVWXYZ 이후 QRST까지 출력된 것을 볼 수 있다.
- 이는 배열에 남아 있는 자료이다.
이는 for문을 조금 바꿔본다.
for (int j=0; j<i; j++) {
System.out.print((char)bs[j]);
}
OutputStream
- 바이트 단위 출력 스트림 최상위 클래스
- 많은 추상 메서드가 선언되어 있고 하위 스트림이 상속받아 구현
주요 하위 클래스
FileOutputStream : 파일에서 바이트 단위로 자료를 씀
ByteArrayOutputStream : byte 배열 메모리에서 바이트 단위로 자료를 씀
FilterOutputStream : 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스
주요 메서드
int write( ) : 한 바이트를 출력
int write(byte b [ ]) : b[ ] 크기의 자료를 출력
int write(byte b[ ], int off, int len) : b[ ] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력
void flush( ) : 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력
void close( ) : 출력 스트림과 연결된 대상 리소스를 닫음. 출력 버퍼가 비워짐.
* flush( )와 close( ) 메서드
· 출력 버퍼를 비울 flush( ) 메서드 사용
· close( ) 메서드 내부에서 flush( )가 호출되므로 close( ) 메서드가 호출되면 출력 버퍼가 비워짐