프로그램에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 많이 이루어진다. 데이터는 사용자로부터 키보드를 통해 입력될 수 도있고, 파일 또는 네트워크로부터 입력될 수 도 있다. 데이터는 반대로 모니터로 출력될 수도 있고, 파일로 출력되어 저장될 수도 있으며 네트워크로 출력되어 전송될 수도 있다.
입력스트림과 출력 스트림
프로그램을 기준으로 들어오는 것을 입력스트림 , 나가는 것을 출력스트림이라고 한다.
입력스트림의 출발지는 키보드, 파일, 네트워크상의 프로그램이 될 수 있고, 출력스트림의 도착지는
모니터, 파일, 네트워크상의 프로그램이 될 수 있다.
프로그램이 네트워크상의 다른 프로그램과 데이터 교환을 하기 위해서는 양쪽 모두 입력 스트림과 출력 스트림이 따로 필요하다. 스트림의 특성이 단방향이므로 하나의 스트림으로 입력과 출력을 모두 할 수 없다.
자바에서 기본적으로 제공하는 I/O 기능은 java.io 패키지에서 제공된다.
java.io 패키지의 주요 클래스 설명 |
|
File | 파일 시스템의 파일 정보를 얻기 위한 클래스 |
Console | 콘솔로부터 문자를 입출력하기 위한 클래스 |
InputStream/OutputStream | 바이트단위 입출력을 위한 최상위 입출력 스트림 클래스 |
FileInputStream / FileOutputStream DataInputStream / DataOutputStream ObjectInputStream / ObjectOutputStream PrintStream BufferedInputStream / BufferedOutputStream |
바이트단위 입출력을 위한 하위 스트림 클래스 |
Reader / Writer | 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스 |
FileReader / FileWriter InputStreamReader / OutputStreamWriter PrintWriter BufferedReader / BufferedWriter |
문자 단위 입출력을 위한 하위 스트림 클래스 |
1. InputStream
바이트 기반 입력 스트림의 최상위 클래스로 추상클래스이다. 모든 바이트기반 입력스트림은 이 클래스를 상속받아서 만들어진다.
InputStream클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메서드가 정의되어 있다.
리턴타입 | 메서드 | 설명 |
int | read() | 입력스트림으로부터 1바이트를 읽고 읽은 바이트를 리턴한다. |
int | read(byte[] b) | 입력스트림으로부터 읽은 바이트들을 매개값으로 주어진 바이트 배열b에 저장하고 실제로 읽은 바이트 수를 리턴한다. |
int | read(byte[] b,int off, int len | 입력 스트림으로부터 len개의 바이트만큼 읽고 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 실제로 읽은 바이트 수인 len개를 리턴한다. 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수를 리턴한다. |
int | close() | 사용한 시스템 자원을 반납하고 입력 스트림을 닫는다. |
read() 메서드
입력스트림으로부터 1바이트를 읽고 4바이트 int타입으로 리턴한다. 따라서 리턴된 4바이트 중 끝의 1바이트에만 데이터가 들어있다.
더 이상 입력 스트림으로부터 바이트를 읽을 수 없다면 read() 메서드는 -1을 리턴하는데, 이것을 이용하면 읽을 수 있는 마지막 바이트까지 루프를 돌면 한 바이트씩 얻을 수 있다.
InputStream is = new FileInputStream("C:/test.jpg");
int readByte;
while ((readByte = is.read()) != -1 ) {
}
예제 (키보드로 입력한 값을 전부 출력하기 )
public static void main(String[] args) {
InputStream is;
is = System.in;
InputStreamReader isr = new InputStreamReader(is);
try {
int readValue = -1;
while((readValue = isr.read()) != -1){
System.out.println("키보드로 읽어온 값:" + readValue + "문자값" + (char) readValue);
}
} catch (IOException e) {
e.printStackTrace();
}
입력값
가나다라마
출력값
키보드로 읽어온 값:44032 문자값 :가
키보드로 읽어온 값:45208 문자값 :나
키보드로 읽어온 값:45796 문자값 :다
키보드로 읽어온 값:46972 문자값 :라
키보드로 읽어온 값:47560 문자값 :마
키보드로 읽어온 값:13 문자값 :
키보드로 읽어온 값:10 문자값 :
13, 10의 문자값이 빈 이유는 enter 값이기 때문이다. 참고로 enter은 2바이트를 가지고 있다.
read(byte[ ] b)메서드
입력스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 바이트를 읽고 배열에 저장한다. 그리고 읽은 바이트 수를 리턴한다.
앞서 read() 메서드와 같이 입력스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴하며 이것을 이용하면, 읽을 수 있는 마지막 바이트까지 루프를 돌며 읽을 수 있다.
InputStream is = new InputStream("C:/test.jpg");
int readByteNo;
byte[ ] readBytes = new byte[100];
whhile((readByteNo = is.read(readBytes)) != -1) {
}
입력 스트림으로부터 100개의 바이트가 들어온다면 read() 메서드는 100번을 루핑해서 읽어들여야한다. 그러나 read(byte b) 메서드는 한 번 읽을 때 매개 값으로 주어진 바이트배열 길이만큼 읽기 때문에 루핑횟수가 현저히 줄어든다.
많은 양의 바이트를 읽을 때는 read(byte[ ] b) 메서드를 사용하는 것이 좋다.
read(byte b, int off, int len)메서드
입력스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 읽은 바이트 수인 len개를 리턴한다.
마찬가지로 입력스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴한다.
read(byte[ ] b) 와의 차이점은 한 번에 읽어 들이는 바이트 수를 len 매개값으로 조절할 수 있고, 배열에서 저장이 시작되는 인덱스를 지정할 수 있다는 점이다. 만약 off를 0으로, len을 배열의 길이로 준다면 read(byte[ ] b)와 동일한다.
▶ read() 메서드 예제
public class KeyboardTest {
public static void main(String[] args) {
InputStream is;
is = System.in;
try {
int readValue = is.read();
System.out.println("키보드로 읽어온 값:" +readValue);
} catch (IOException e) {
e.printStackTrace();
}
}
}
앞서 설명했듯이 InputStream은 바이트 기반으로 입력스트림의 최상위 클래스이다. 추상클래스이기 때문에 당연히 객체 생성은 되지 않는다. System.in으로 직접 키보드로 입력받은 값을 is에 담는다.
is.read() 메서드는 입력받은 값이 문자이기 때문에 바이트로 리턴을 해준다. 그 값을 readValue 변수에 담고 값을 출력한다.
입력값: ABC
결과값: 65
첫번째 값 A에 해당하는 값으로 65가 출력된다.
try {
int readValue = is.read();
System.out.println("키보드로 읽어온 값:" +readValue +","+ (char)readValue);
} catch (IOException e) {
e.printStackTrace();
}
입력값: ABC
출력값: 키보드로 읽어온 값:65,A
한글로 입력하면 한글이 깨지는 현상이 일어난다. '가 '를 구성하는 하나의 바이트만을 가져왔기 때문이다.
입력값:가나다
키보드로 읽어온 값:234,ê
한글값 그대로 출력하는 방법
InputStreamReader isr = new InputStreamReader(is);
try {
int readValue =isr.read();
System.out.println( (char)readValue);
}catch(IOException e) {
e.printStackTrace();
}
InputStreamReader 클래스를 사용하여 문자단위로 입력한다.
'가' 라는 문자하나만을 읽게 하는 방법이다.
InputStreamReader는 문자단위를 입력받기때문에 위에서 바이트 값으로 키보드에 입력을 받으면 문자값으로 변환해서 readValue 변수가 참조하며 int값이기 때문에 char로 형변환을 하여 출력하게 한다.
입력값: 가나다
출력값: 가
- close()메서드
inputStream 을 더 이상 사용하지 않을 경우에는 close() 메서드를 호출해서 InputStream 에서 사용했던 시스템자원을 풀어준다.
is.close();
'java' 카테고리의 다른 글
java_15_Io 패키지 - 출력스트림 (0) | 2021.10.28 |
---|---|
Io패키지 FileReader (0) | 2021.10.28 |
java_13_컬렉션 프레임워크 (0) | 2021.10.26 |
java_13_java.lang과 java.util 패키지 & toString(), equals() (0) | 2021.10.26 |
java_12_예외처리2 (예외 처리 코드 ,다중catch ,catch순서,예외떠넘기기) (0) | 2021.10.24 |