면접 준비 용 자바 개념 정리 7

2018-09-27

1. 입력스트림과 출력 스트림

  • 프로그램이 데이터를 입력받을 때에는 입력 스트림(InputStream)이라 부르고, 프로그램이 데이터를 보낼 때에는 출력 스트림(OutputStream)이라고 부른다.
  • 스트림 특성이 단방향이므로 하나의 스트림으로 입력과 출력을 모두 할 수 없기 때문에 입력 스트림과 출력 스트림이 따로 필요하다.
  • 바이트 기반 스트림은 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받을 수 있으나, 문자 기반 스트림은 오로지 문자만 받고 보낼 수 있도록 특화되어 있다.
java.io 패키지의 주요 클래스 설명
File 파일 시스템의 파일 정보를 얻기 위한 클래스
InputStream / OutputStream 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileInputStream / FileOutputStream / BufferedInputStream / BufferedOutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스
Reader / Writer 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileReader / FileWriter / BufferedReader / BufferedWriter 문자 단위 입출력을 위한 입출력 스트림 클래스


1-1. InputStream

  • read() : read() 메소드는 입력 스트림으로부터 1바이트를 읽고 4바이트 int 타입으로 리턴한다. 따라서 리턴된 4바이트 중 끝의 1바이트에만 데이터가 들어가 있다. 더 이상 입력 스트림으로부터 바이트를 읽을 수 없으면 read() 메소드는 -1을 리턴한다.
InputStream is = new FileInputStream("C:/test.jpg");
int readByte;
while((readByte=is.read()) != -1) {...}


  • read(byte[] b): 입력 스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 바이트를 읽고 배열에 저장한다. 그리고 읽은 바이트 수를 리턴한다. 입력 스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴한다. 입력 스트림으로부터 100개의 바이트가 들어온다면 read()는 100번 루핑해서 읽어들여야 하지만, read(byte[] b) 메소드는 한번 읽을 때 매개값으로 주어진 바이트 배열 길이만큼 읽기 때문에 루핑 횟수가 줄어든다. 그러므로 많은 양의 바이트를 읽을 때는 read(byte[] b) 메소드를 사용하는 것이 좋다.
InputStream is = new FileInputStream("C:/test.jpg");
int readByteNo;
byte[] readBytes = new Byte[100]
while((readByteNo=is.read(readBytes)) != -1) {...}


  • close(): InputStream을 더이상 사용하지 않을 경우 close() 메소드를 호출해서 InputStream에서 사용했던 자원을 풀어준다.



1-2. OutputStream

  • write(int b): int 값에서 끝에 있는 1바이트만 출력 스트림으로 보낸다.
OutputStream os = new FileOutputStream("C:/test.jpg");
byte[] data = "ABC".getbytes();
for(int i=0; i<data.length; i++){
 os.write(data[i]); // "A","B","C"를 하나씩 출력
}


  • write(byte[] b): 매개값으로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보낸다
OuputStream os = new FileOutputStream("C:/test.jpg");
byte[] data = "ABC".getBytes();
os.write(data); // "ABC" 모두 출력
  • flush(): 출력 스트림은 내부에 작은 버퍼(buffer)가 있어서 데이터가 출력되기 전에 버퍼에 쌓여있다가 순서대로 출력된다. flush() 메소드는 버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다
  • close(): OutputStream 을 더이상 사용하지 않을 경우에 close() 메소드를 호출해서 OutputStream에서 사용했던 시스템 자원을 풀어준다.



1-3 Reader

  • Reader는 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스이다. 모든 문자 기반 입력 스트림은 이 클래스를 상속 받아서 만들어진다.
  • read(): 입력 스트림으로부터 한개의 문자(2바이트)를 읽고 4바이트 int 타입으로 리턴한다. 따라서 리턴된 4바이트 중 끝에 있는 2바이트에 문자 데이터가 들어있다. read() 메소드가 리턴한 int 값을 char 타입으로 변환하면 읽은 문자를 얻을 수 있다.
Reader reader = new Reader("C:/test.txt");
int readData;
while((readData=read.read()) != -1){
  char charData = (char) readData;
}


  • read(char[] cbuf): 입력 스트림으로부터 매개값으로 주어진 문자 배열 길이만큼 문자를 읽고 배열에 저장한다. 그리고 읽은 문자 수를 리턴한다. 예를 들어 입력 스트림에서 세 개의 문자가 들어온다면 길이가 2인 문자 배열로 두 번 읽을 수 있다. 많은 양의 문자를 일긍ㄹ 때는 read(char[] cbuf) 메소드를 사용하는 것이 좋다.
Reader reader = new Reader("C:/test.txt");
int readCharNo;
char[] cbuf = new char[2];
while((readCharNo=reader.read(cbuf)) != -1) { ...}



1-4 Writer

  • write(int c): 매개변수로 주어진 int 값에서 끝에 있는 2바이트(한개의 문자)만 출력 스트림으로 보낸다.
Writer writer = new FileWriter("C:/test.txt");
char[] data = "박보검".toCharArray();
for(int i=0; i<data.length; i++){
  writer.write(data[i]);    // "박","보","검" 하나씩 출력
}


  • write(char[] cbuf): 매개값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보낸다
Writer writer = new FileWriter("C:/test.txt");
char[] data = "박보검".toCharArray();
writer.write(data); // "박보검" 모두 출력


  • flush(): 문자 출력 스트림은 내부에 작은 버퍼가 있어서 데이터가 출력되기 전에 버퍼에 쌓여있다가 순서대로 출력된다. flush() 메소드는 버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다. 그러므로 프로그램에서 더 이상 출력할 문자가 없다면 flush() 메소드를 마지막으로 호출하여 모든 문자가 출력되도록 해야 한다.

참고

이것이 자바다 신용권의 Java 프로그래밍 정복