포스트

11. IO

입출력

1) 입출력

  • input과 output의 약자. 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고 받는 것
  • 입출력 데이터를 처리할 공통적인 방법으로 스트림 이용

2) 스트림(Stream) 클래스

  • 모든 스트림은 단방향이며 각각의 장치마다 연결할 수 있는 스트림 존재
  • 단방향이기 때문에 입출력을 동시에 하려면 2개의 스트림이 필요

3) InputStream

  • 바이트 기반 입력 스트림의 최상위 클래스로 추상클래스이다

4) OutputStream

  • 바이트 기반 출력 스트림의 최상위 클래스로 추상클래스이다

5) Reader

  • 문자 기반 입력 스트림의 최상위 클래스

6) Writer

  • 문자 기반 출력 스트림의 최상위 클래스

7) 사용예시

  • 파일로 사용하려는 프로젝트에서 새로만들기 하여 General 폴더의 file을 만들어준다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
< 바이트 기반 OutputStream >
// FileOutputStream fos = new FileOutputStream("test1.txt");
// 이렇게 하면 FileNotFoundException 예외 발생. 예외 처리 필요
// -> 파일로 만들어지기 전에 예외발생하여 종료 될 수 있다는 예외

FileOutputStream fos = null;

try {
  fos = new FileOutputStream("test1.txt");
    // 현재 프로그램에서 test1.txt 파일로 출력하는 통로 객체 생성
    // 이 파일은 목적지가 필요하고 현재 현재 해당 12_IO 프로젝트 폴더가 기본 목적지로 설정

  String str = "Hello";

  for( int i = 0; i < str.length(); i++){
    fos.write(str.charAt(i));
      // write는 IOException을 발생. 예외처리 필요
  }
} catch (IOException e){
  // FileNotFoundException은 IOException의 자손이므로 
  // 다형성에 의해 IOException로 둘 다 잡을 수 있다

  e.printStackTrace(); // 예외 추적 후 출력
} finally {
  // 쓸데없는 통로 지우기, 메모리 관리 차원 --> 필수작성
  try{
    fos.close();
    // 통로 닫는 메소드도 예외 발생하므로 예외처리 해주기
  } catch (IOException e) {
    e.printStackTrace();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
< 바이트 기반 InputStream >

FileInputStream fis = null;

try {
  tis = new FileInputStream("test1.txt");

  // FileInputStream은 1byte씩만 읽어올 수 있다
  while(true){
    int data = fis.read();
    // 다음 1byte를 읽어오는 정수형 반환타입의 메소드. 유니코드 정수
    // 다음 내용이 없으면 -1 반환
    if( data == -1 ) break;

    System.out.print( (char)data );
  }
} catch ( IOException e ) {
  e.printStackTrace();
} finally {
  try {
    fis.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
< 문자 기반 OutputStream >

FileWriter fw = null;

try {
  fw = new FileWriter("test1.txt");
  // 매개변수로 true를 추가하면 실행한만큼 연속으로 작성된다. ("test1.txt", true);

  String str = "안녕하세요. Hello. 1234. !#";

  fw.write(str);

} catch ( IOException e ) {
  e.printStackTrace();
} finally {
  try {
    fw.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
< 문자 기반 InputStream >

FileReader fr = null;

try {
  fr = new FileReader("test1.txt");

  while(true){
    int data = fr.read();
      // 다음 문자 읽어옴. 없으면 -1
    if( data == -1 ) break;

    System.out.print( (char)data );
  }
} catch ( IOException e ) {
  e.printStackTrace();
} finally {
  try {
    fr.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}