레이블이 BufferedReader인 게시물을 표시합니다. 모든 게시물 표시
레이블이 BufferedReader인 게시물을 표시합니다. 모든 게시물 표시

2015년 11월 3일 화요일

BufferedReader에 대한 개념 세우기





BufferedReader에 대한 개념 세우기

BufferedReader는 인터넷에서 데이타를 읽어올 때 유용하다. 왜냐하면 인터넷은 원격에서 가져오기 때문에
속도가 늦을 수 있다. 따라서 버퍼를 이용해서 읽는 것이 필요하다.
따라서 BufferedReader의 객체를 생성하는 법을 아는 것은 요긴하다.

BufferedReader의 핵심은 이것이다.
InputStream이 입력을 위한 가장 기본인데 BufferedReader는 InputStream으로부터 버퍼에로
읽어온다는 개념이 BufferedReader의 핵심 개념이다. 
따라서 BufferedReader의 생성자 자체가 InputStream을 매개인자로 갖는다.

BufferedReader의 생성자를 보면 아래와 같이 2종류가 있다.

BufferedReader(Reader in)
BufferedReader(Reader in, int size)

1) 생성자(다른 것은 API 참조)
BufferedReader(Reader in)

2) Reader 클래스의 Known Direct Subclasses들은 다음과 같다
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

3) 따라서 BufferedReader의 생성자 매개인자로 InputStreamReader의 객체가 올수 있다.

4) InputStreamReader의 생성자(다른 것은 API 참조)
public InputStreamReader (InputStream in, Charset charset)
==> Charset charset는 한글 코드에 대한 디코딩 정보이다. 보통 웹은 euc-kr(2바이트 한글)이고 자바에서는 유니코드 체계인 utf-8이다

5) InputStreamReader의 객체를 생성할 수 있는 메소드
  -. URLConnection의 getInputStream();
  -. HttpURLConnection이 URLConnection을 상속받았기 때문에 여기서도 가능하다

안드로이드와 서버와의 통신에서 연결하는 절차





안드로이드와 서버와의 통신에서 연결하는 절차

-. URL로 연결할 지점에(접속할 주소) 대한 객체를 만든다. 

URL url = new URL("http://www.google.com");

※ URL이란 A Uniform Resource Locator that identifies the location of an Internet resource as specified by RFC 1738.

-. HttpURLConnection 클래스의 openConnection() 메소드로 해당 주소에 접속한다. 
이때 반환되는 객체가 URLConnection 클래스의 객체이다. 이때 프로토콜이 뭐냐에 따라 
HttpURLConnection, FtpURLConnection... 등이 반환 된다. 따라서 해당 프로토콜에 맞게 다운캐스팅해서 사용하면 된다.

HttpURLConnection httpURL = (HttpURLConnection)url.openConnection();

-. 해당 프로토콜에 필요한 각종 속성을 설정한다. API문서를 참조

httpURLCon.setConnectTimeout(10000);
httpURLCon.setUseCaches(false);

-. Http 연결일 경우는 요청방법을 지정해야 한다. 

httpURLCon.setRequestMethod("GET"); //이게 디폴트
httpURLCon.setRequestMethod("POST");

-. 모든 속성이 완료되면 서버에 요청을 보낸다. 요청이 무사히 전달됐으면 HTTP_OK(200)가 리턴된다. 반환되는 값에 대한 정보는 HttpURLConnection 클래스에 Constants로 잘 정의되어 있다.

httpURLCon.getResponseCode(); //public int getResponseCode ()

-. 다음과 같이 BufferedReader를 이용해서 서버에서 보내온 데이타를 읽는다.
BufferedReader 클래스는 생성자의 매개인자로 Reader 클래스의 객체가 와야 한다.
public BufferedReader (Reader in)
여기서 Reader클래스를 상속받은 클래스들이 BufferedReader, CharArrayReader, FilterReader, 
InputStreamReader, PipedReader, StringReader이다.
따라서 생성의 매개인자로 Reader클래스를 상속받은 하위 클래스의 객체가 올수있다. 
따라서 InputStreamReader 객체가 올 수 있다. 
InputStreamReader의 객체 생성은 생성자가 아래와 같이 되어 있다.

InputStreamReader(InputStream in) ==> InputStreamReader의 생성자. 매개인자로는 InputStream 객체가 올수 있다.
매개인자로 들어갈 InputStream 객체를 얻는 방법은 URLConnection의 메소드인 getInputStream()을 통해서 얻을 수 있다.

public InputStream getInputStream() ==> 이 메소드는 HttpURLConnection이 상속받은 상위 클래스인 URLConnection의 메소드인데 상속 

BufferedReader br = new BufferedReader(new InputStreamReader(httpURLCon.getInputStream()));
String temp = ""; //서버에서 보내온 데이터를 받을 공간

BufferedReader 클래스의 메소드 가운데 이런 편리한 메소드가 있다. 

public String readLine () 
      ⇒ Returns the next line of text available from this reader. 
          A line is represented by zero or more characters followed 
          by '\n', '\r', "\r\n" or the end of the reader. 
          The string does not include the newline sequence.
      ⇒ Returns : the contents of the line or null if no characters were read before the end of the reader has been reached.
      ⇒ 한 마디로 readLine() 메소드는 캐리지 리턴을 기준으로 한 라인씩 읽어서 String으로 반환한다.

다음과 같이 서버로 부터 보내온 데이터를 읽으면 된다.

String addr = "";
for(;;){
      temp = br.readLine();
      if (temp == null) 
         break;
      addr += temp;
}
       
br.close(); //다 읽었으면 닫아 준다.
httpURLCon.disconnect(); //연결을 끊어 준다.

네트워크에 연결하는 경우는 다양한 이유로 연결에 실패할 수 있기 때문에 각종 Exception이 발생할 수 있다. 이에 대해서는 API문서를 참조할 것.