상세 컨텐츠

본문 제목

JAVA 스트림에 관한 이야기

언어/Java

by codeon 2024. 5. 26. 23:16

본문

반응형

자바에서 가장 기본적인 스트림은 InputStream과 OutputStream 입니다. 스트림의 목적은 데이터 이동 입니다. 원하는 목적지로 이동시키기위해 스트림을 구현한 객체를 사용합니다. 모든 프로그램의 목적은 데이터를 가져와 가공 처리 후 필요로 하는 대상에게 전달해 주는 것 입니다.

Input Straem과 Output Stream의 사용 목적

 

Input Stream은 원천이 되는 데이터를 자바 프로그램으로 가져올 때 사용합니다.

Output Stream의 경우는 자바 프로그램에서 데이터를 내보낼 때 사용합니다.

import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		StringBuffer buffer = new StringBuffer();
		int ch = 0;
		try {
			while (true) {
				
				ch = System.in.read();
				System.out.println(ch);
				buffer.append((char) ch);
				
				if(ch == -1) {
					break;
				}
			}

		} catch (IOException e) {}
		
		System.out.print(buffer);
	}
}

 

프로그램을 실행시키고 프로그램을 중지시키려면 윈도우의 경우 (Ctrl + Z) 엔터를 Unix의 경우 (Ctrl+D)를 입력하고 엔터를 해야만 종료 -1 값이 프로그램에 전달 됩니다. 위 프로그램은 키보드로 입력한 내용이 화면에 바이트 숫자로 표시되고 마지막에 입력된 전체 값이 문자열로 변환해 입력된 내용을 보여주는 프로그램 예제 입니다. 한 번 실행시켜 보시기 바랍니다.

위 샘플 소스 내용중 Sytem.in.read() 부분을 확인해 보세요. Java에서 기본적으로 제공되는 InputStream 구현 중 하나 입니다. 입력 스트림의 원천 데이터는 아래와 같습니다. "corresponds to keyboard input or another input source specified by the host environment or user",  호스트 환경 또는 사용자가 지정한 키보드 입력 또는 다른 입력 소스에 해당합니다.

 // ==================================================================================
 /*
 * @since   JDK1.0
 */
public final class System {
    /**
     * The "standard" input stream. This stream is already
     * open and ready to supply input data. Typically this stream
     * corresponds to keyboard input or another input source specified by
     * the host environment or user.
     */
    public final static InputStream in = null;
    
	/**
     * Initialize the system class.  Called after thread initialization.
     */
    private static void initializeSystemClass() {

        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
        setIn0(new BufferedInputStream(fdIn));
        setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
        setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));
// ==================================================================================
 /*
 * @author  Pavani Diwanji
 * @since   JDK1.0
 */
public final class FileDescriptor {
	/**
     * A handle to the standard input stream. Usually, this file
     * descriptor is not used directly, but rather via the input stream
     * known as {@code System.in}.
     *
     * @see     java.lang.System#in
     */
    public static final FileDescriptor in = standardStream(0);

    /**
     * A handle to the standard output stream. Usually, this file
     * descriptor is not used directly, but rather via the output stream
     * known as {@code System.out}.
     * @see     java.lang.System#out
     */
    public static final FileDescriptor out = standardStream(1);

    /**
     * A handle to the standard error stream. Usually, this file
     * descriptor is not used directly, but rather via the output stream
     * known as {@code System.err}.
     *
     * @see     java.lang.System#err
     */
    public static final FileDescriptor err = standardStream(2);

    /**
     * Tests if this file descriptor object is valid.
     *
     * @return  {@code true} if the file descriptor object represents a
     *          valid, open file, socket, or other active I/O connection;
     *          {@code false} otherwise.
     */
    public boolean valid() {
        return ((handle != -1) || (fd != -1));
    }
    
/* This routine initializes JNI field offsets for the class */
    private static native void initIDs();

    private static native long set(int d);

    private static FileDescriptor standardStream(int fd) {
        FileDescriptor desc = new FileDescriptor();
        desc.handle = set(fd);
        return desc;
    }

또다시 여기 중요한 부분이 있습니다. private static native long set(int d); 이 부분은 native 소스에서 입력 대상을 찾는 다는 뜻입니다. 운영체제 별로 구현된 native소스를 따라가게 되있습니다. 더 자세한 내용을 알고 싶다면 댓글을 주시면 답변 드리도록 하겠습니다.

반응형

관련글 더보기