본문 바로가기

카테고리 없음

I/O 스트림 (2) - 표준 입출력 스트림, 바이트 단위 입출력 스트림

반응형

표준 입출력 스트림


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( ) 메서드가 호출되면 출력 버퍼가 비워짐

 

 

반응형