차근차근/JAVA JSP

inputstreamreader

예쁜꽃이피었으면 2014. 7. 26. 01:38

http://o23750.egloos.com/tag/InputStreamReader/page/1

 

1상속 
1_1코드의 재사용
    1_1_1  변수, 멤버 field
    1_1_1  다형성
!명심 object class 메소드는 반드시 알아라
-우선은 toString(), equals(), clone()...등등
!tip 
-- System.out.println()에서만 객체.toString을 하면 객체를 찍은것도 동일한 경과가 나오다. 신기하지?
-- equals()는 object안에서는 주소를 비교하도록 되어있어요.

입력
1. System.in.read();
2. 문자열->원하는 자료형으로 parsing

기본명령은 java.lang.* 에 다 들어 있다
import java.util.Date; = 자바폴더 밑에 유틸폴더 밑에 있는 Date를 쓸꺼에요
import java.io.*; 에 입출력 관련 클래스가 들어있어요
System.in.read(); 는 1byte를 읽어서 int로 반환합니다. 
BufferedReader 읽어드린것을 가지고 있어요. 언제까지 용량이 다찰때까지나 내보내라고 하기 전까지
                       2byte씩 넣어줘요
1byte로 들어오는걸 InputStream 이라 부르고요(주로 그림이나 파일등을 처리해요), 2byte씩 들어오는걸 Reader라고 해요(char담당)
InputStreamReader = inputStream으로 들어오는것을 Reader화 시켜라. 이런게 왜 있어야 하나? 실제 키보드로 컴퓨터에 자료를 넣어줄때 바이트 단위로 가지만 사람이 읽어야 하니깐.

int data=System.in.read();
BufferdReader r = new BufferdReader(new InputstreamReader(System.in))
String str=r.readLine();
//보충 설명 : 자 봅시다. 우선 System.in(얇은 빨래) 이거는 1바이트짜리니깐  InputstreamReader(얇은 빨대와 굵은 빨대를 이어주는애)이걸로 2바이트로 바꿔요 그래서 BufferdReader(굵은 빨대)로 읽는거지요.. 

해보자
import java.io.*;
public class IOTest1{
        pubilc static void main(String[] agrs){
                System.out.print("age?");
                int age=System.in.read();
                System.out.print("\nage:"+age);
        }
}
컴파일하면
IOTest1.java:6: unreported exception java.io.IOException; must be caught or declared to be thrown
                    int age=System.in.read();
가 나와요. 이것 한마디로' 예외 처리해주세요' 라는거지요. 이렇게되면 2가지 방법이 있는데 떠넘기거나 처리하는게 있는데 여기서는 떠넘기기를 할꺼에요 자세한건 나중에....
import java.io.*;
public class IOTest1{
        pubilc static void main(String[] agrs) throws IOException{
                System.out.print("age?");
                int age=System.in.read();
                System.out.print("\nage:"+age);
        }
}

처음과 다른게 뭐가 있어요? throws IOException 이거죠? 이게 떠넘기는 방법이에요 역시 자세한건 나중에
자 실행해보자근영. 해보니 제대로 돌아가는거 같은데 1을 입력하면 49가 나오죠? 이건 뭥미라고 하기전에
1을 아스키코드에서 보면 49로 나와요 그래서 그래요. 그러니 올바른 답이 나오려면
int age=System.in.read();
이부분을
int age=System.in.read()-'0';
으로 하면되요

이젠 위에꺼 반복해서 받아볼까요?

import java.io.*;
public class IOTest1{
        pubilc static void main(String[] agrs) throws IOException{
                char yesNo='y';
                while(yesNo=='Y'||yesNo=='y'){   
                        System.out.print("age?");
                        int age=System.in.read()-'0';        
                        System.out.print("\nage:"+age);
                        System.out.print("again?");
                        yesNo=(char)System.in.read();
                }
        }
}
해보면 원하는 결과가 안나와
그러면 while()마지막에 System.out.print("\n44444"+yesNo+"/////");
을 치고 생각해보면
실제 돌아가는 상황이
age에 9가 들어간다음에 엔터가 들어가는데 원래 enter는 캐리지리턴(/r)과 개행(\n)이 합쳐진거야
그러니깐 실제로 yesNo에는 캐리지리턴이 들어가 이제 이해가?
결국 System.in.read()가 4개 필요하지 어디에 들어갈까? int age=System.in.read()-'0'; 와  yesNo=(char)System.in.read();
에 들어가면되겠지?
해봐 될꺼야. 근데 이거는 한글자만 받으니 2자리 나이를 표현 못하잖아 쉽게 말해서 이걸로 나이를 받는건 나빠욧
       
!tip 
1. 자동형 변환
정수 > 실수
b>s>ch>i>l, f>d
2. 명시적 형변환
실수>정수
3.안되요
boolean>
4.parsing
형변환이 안되는걸 되게 해주에요

import java.io.*;
public class IOTest2{
 public static void main(String[] agrs) throws IOException{
  System.out.println("BufferedReader Test");
  InputStream keyBoardData=System.in;                                         //키보도를 1바이트를 받아요
  InputStreamReader link=new InputStreamReader(keyBoardData);   //1바이트 빨대와 2바이트 빨대를 연결해요
  BufferedReader r= new BufferedReader(link);                              //2바이트로 받아요
  System.out.print("나이");
  int age=Integer.parseInt(r.readLine());                                  //  readLine()이 string으로 반환되니 int형으로 파싱해준거에요ㅕ//  String age=r.readLine();
  System.out.println("나이:"+age);
 }
}
위에껄 반복해 보아요
import java.io.*;
public class IOTest3{
        public static void main(String[] agrs) throws IOException{
              System.out.println("BufferedReader Test");
              String ch="n";
              while(ch.equalsIgnoreCase("n")){
                   InputStream keyBoardData=System.in;
                   InputStreamReader link=new InputStreamReader(keyBoardData);
                   BufferedReader r= new BufferedReader(link);
                   System.out.print("나이");
                   int age=Integer.parseInt(r.readLine());
                   System.out.print("주소");
                   String address=r.readLine();
                   System.out.println("나이:"+age);
                   System.out.println("주소:"+address);
                   System.out.print("go?");
                   ch=r.readLine();
                   System.out.print(ch);
              }

         }
}

 

추가+)

컴퓨터는 1바이트씩 처리하기에 1바이트씩 읽어들이지만 자바의 char형은 2바이트라 2바이트씩 처리하도록 바꿔준다는 말이지?

반응형