다음의 코드는 키보드로부터 Press된 데이터를 화면으로 출력하는 코드이다.

 

주의할 점은 키보드를 누른다고해서 바로 read()메소드를 통해서 JVM에게 전달되는 것이 아니다.  write()메소드도 마찬가지로 눌려진 값은 OS가 관리하는 키보드 버퍼에 쌓이게되고 JVM에게 입력한 값을 전달하기 위해서는 엔터키를 입력해야 한다. JDKPrintStream write()메소드(System.out.write())의 소스를 보게되면 ‘\n”인지를 체크해서 개행문자인 경우 flush()를 호출 하도록 되어있다.

 

이렇게 전달된 문자열은 read()메소드를 통해서 한바이트씩 읽어 들일 수 있다. 즉 읽어들인 정수 하위 8비트를 그대로 표준 출력장치(모니터)에 출력하게 된다. (따라서 2바이트 문자권의 바이트를 읽게된다면 하위 8비트(1바이트)만 읽게 되므로 잘못된 해석을 할수 밖게 없다.)

 

 

public class SystemInputTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              int i = 0;

 

              try {

                     while ((i = System.in.read()) != -1) {

                           System.out.write(i);

                     } // while

              } catch (IOException e) {

                     System.out.println(e);

              }

       }

}

 

 

결과

Hello

Hello

 

헬로

헬로

 

 

Posted by Steven J.S Min
,

 

임시파일 생성, 정렬이나 임시로 생성해야할 파일이 있는 경우 생성한다.

 

package ch4;

 

import java.io.File;

import java.io.IOException;

 

public class TempFile {

 

       public static void main(String[] args) {

              try {

                     // tmp_6551.dat 파일과 같이 'tmp_' 시작하고 '.dat' 끝나는 임시파일 생성

                     File f = File.createTempFile("tmp_", ".dat");

                     System.out.println("60 동안 멈춰있습니다.");

                     f.deleteOnExit(); // JVM 종료될때 임시 파일을 자동으로 삭제한다.

                     try {

                           Thread.sleep(60000);// 60 정지

                     } catch (InterruptedException e1) {

                           System.out.println(e1);

                     }

                    

              } catch (IOException e) {

                     System.out.println(e);

              }

       } // main

}

 

Posted by Steven J.S Min
,

다음 코드는 키보드, 소켓, 파일로부터 라인단위로 문자를 읽어 출력한다. 다음 코드에서 이용하는 클래스는 '문자단위 처리 클래스'를 이용한 예이다.

 

package ch3;

 

import java.io.BufferedReader;

import java.io.InputStreamReader;

 

public class BufferedReaderTest {

 

       public static void main(String[] args) throws Exception {

 

              // InputStreamReader input = new InputStreamReader(System.in);               // 키보드로부터 입력

              // InputStreamReader input = new InputStreamReader(socket.getInputStream()); // 소켓으로부터 입력

              // FileReader        input = new FileReader("C:\\Temp\\Hello.txt");          // 파일로부터 입력

 

              InputStreamReader input = new InputStreamReader(System.in);

              BufferedReader br = new BufferedReader(input);

 

              while (true) {

                     String str = br.readLine();

                     if (str == null || str.length() == 0) {

                           break;

                     }

                     System.out.println("입력받은 문자열 :" + str);

              }

 

       }

}

 

 

 

 

 

   InputStreamReader Constructor의 인자로 InputStream 타입을 받는다.

   FileReader InputStream으로 부터 확장되 타입이므로 InputStreamReader

   Constructor의 인자로 전달 될 수 있다.

  

Constructor and Description

InputStreamReader(InputStream in)

Creates an InputStreamReader that uses the default charset.

InputStreamReader(InputStream in, Charset cs)

Creates an InputStreamReader that uses the given charset.

InputStreamReader(InputStream in, CharsetDecoder dec)

Creates an InputStreamReader that uses the given charset decoder.

InputStreamReader(InputStream in, String charsetName)

Creates an InputStreamReader

 

 

 

 

 

 

 

** 읽고 쓸수있는 클래스는 크게 바이트 단위로 읽고 쓸수 있는 '바이트 스트림클래스'와 문자단위로 읽고 쓸수 있는 '문자 스트림클래스'로 나뉘는데 문자 스트림 클래스들은 위의 예처럼 Reader나 Writer로 클래스 이름이 끝난다.

 

Posted by Steven J.S Min
,

읽고 쓸수있는 클래스들을 크게 두가지로 나뉘는데

바이트 단위로 읽고 쓸 수 있는    바이트 스트림 클래스

문자 단위로 읽고 쓸 수 있는       문자    스트림 클래스

로 나뉜다.

 

자바가 처음 등장했을 때에는 바이트 단위로 읽고 쓸 수 있는 바이트 스트림 클래스만 존재했지만, 2바이트 문화권인 한국, 중국, 일본등의 영향으로 문자 스트림 클래스가 추후에 추가되었다. 이는 한글을 입출력하는 프로그램의 경우, 문자 스트림 클래스를 사용하는 것이 유리하다는 것을 의미한다.

 

 클래스에 사용된 단어

의미

 Stream으로 끝나는 클래스

byte 단위 IO 클래스

 InputStream으로 끝나는 클래스

byte 단위로 입력받는 클래스

 OutputStream으로 끝나는 클래스

byte 단위로 출력받는 클래스

 Reader끝나는 클래스

문자 단위로 입력받는 클래스

 Writer끝나는 클래스

문자 단위로 출력받는 클래스 

 File시작할 경우

파일로부터 입력이나 출력하는 클래스

 ByteArray시작할 경우 

입력클래스의 경우 ByteArray로 읽어들이고, 출력클래스의 경우 클래스 내부의 자료구조에 출력한 후 출력된 결과를 ByteArray로 리턴 

 CharArray시작할 경우

입력클래스의 경우 CharArray로 읽어들이고, 출력클래스의 경우 클래스 내부의 자료구조에 출력한 후 출력된 결과를 CharArray로 리턴

 Filter로 시작할 경우

Filter로 시작하는 IO 클래스는 직접 사용하는 것보다는 상속을 받아 사용하며 사용자가 원하는 내용만 필터링할 목적으로 사용 

 Data로 시작할 경우

다양한 데이터 형식을 입출력할 목적으로 사용된다. 특히 기본형 값(int, float, double)을 출력하는데 유리

 Buffered로 시작할 경우

프로그램에서 Buffer라는 말은 메모리를 의미한다. 입출력 시에 병목현상을 줄이고 싶을 경우 사용

 RandomAccessFile

입력이나 출력을 모두 할 수 있는 클래스로써 파일에서의 임의 위치의 내용을 읽거나 쓸 수 있는 기능을 제공

 

 출처 : 자바 I/O & NIO 네트워크 프로그래밍, 김성박.송지훈 공저

 

자바 IO 관련 클래스는 생성자가 중요한 역할을 한다. 생성자에 어떤 것을 지정했느냐에 따라서 읽어 들여야할 대상과 써야 대상이 틀려 지기 때문이다.(메소드도 마찬가지이다. 메소드에 전달되는 인자가 경우에 따라서 읽어들이는(또는 쓰여지는) 변수가 되고 반환되는 값은 읽어들인(씌여진) 바이트수가 되는 경우가 있다.)

 

바이트 스트림 클래스와 문자 스트림 클래스

 

바이트 스트림 클래스와 문자 스트림 클래스의 계층 구조로 나누면 다음 그림과 같다.

 

바이트 스트림 (저수준 입출력)

ü  1 바이트(8 Bit)를 읽고 쓰기 위한 스트림

ü  2진 데이터 입출력 가능

ü  InputStream, OutputStream 클래스(추상 클래스)와 그 하위 클래스를 이용

 

 

문자 스트림 (고수준 입출력)

ü  16비트(2Byte)로 표현되는 유니코드(nuicode), 문자 단위의 입출력을 다루는 스트림

ü  Reader, Writer 클래스(추상 클래스)와 그 하위 클래스를 이용

           

 

*** 바이트단위 IO와 문자단위 IO클래스 모두 사용법은 비슷하다. 단지 차이가 있다면 바이트단위냐 문자단위로 입출력하느냐의 차이다.

*** 바이트단위 IO클래스와 문자단위 IO클래스가 완전히 따로 사용하지 않는 다는 것이 중요하다.

      >> 문자단위 IO클래스에는 InputStreamReader와 OutputStreamWriter클래스가 있는데 이 두가지 클래스는

           바이트단위 IO클래스와 문자단위 IO클래스간에 다리 역할을 함으로써 서로 협력해서 사용할 수 있게 해준다.

 

 

바이트 스트림과 문자단위 스트림의 비교

ü  바이트 스트림 : 바이트 또는 문자 단위의 입출력만 제공

ü  문자단위 스트림 : 다양한 기본 변수 타입 단위의 입출력이나 버퍼링을 이용한 빠른 입출력 제공하며 문자단위 스트림의 경우 직접 생성할 수 없고, 바이트 스트림을 만든 후 이것을 인자로 문자 스트림을 만들어야 함.

 

Posted by Steven J.S Min
,