2009-12-21 9 views
2

관련 HTTP 연결 문제가 있습니다. 내 코드 :HTTP URL 연결을 완전히 읽을 수 없습니다.

URL url = null; 
try { 
    url = new URL(_url); 
} catch (MalformedURLException e) { 
} 

if (url != null) { 
    HttpURLConnection urlConn = null; 
    InputStreamReader isr = null; 
    try { 
     urlConn = (HttpURLConnection)url.openConnection(); 
     urlConn.setRequestMethod("GET"); 
     urlConn.setConnectTimeout(45000); 

     if(response == HttpURLConnection.HTTP_OK) { 
      StringBuffer readData = new StringBuffer(""); 
      int size = 1024; 
      char[] buffer = new char[size]; 
      int len; 
      isr = new InputStreamReader(urlConn.getInputStream()); 
      while ((len = isr.read(buffer, 0, size)) > 0) { 
       readData.append(buffer, 0, len); 
      } 
     } 
    } 
    catch(Exception e) { 
    } 
    finally { 
     if(urlConn != null) { 

     try { 
      urlConn.disconnect(); 
     } catch(Exception e) {    
     } 
    } 
    if(isr != null) { 
     try { 
      isr.close(); 
     } catch(Exception e) {     
     }    
    } 
} 

이 코드는 데이터를 완전히 다운로드 할 수 없습니다. 예를 들어 : 총 크기는 읽기 : 13,901 바이트 코드 위 크기 읽을 수 : 12,937 바이트 여기 뭐가 문제

를?

상담해주세요.

+0

13901 바이트인지 어떻게 알 수 있습니까? HTTP 내용 길이 헤더에 있습니까? 아니면 디스크에서 제공하는 파일을보고 있습니까? – Paolo

+0

설명서에는 0이 아니라 스트림의 끝에 도달하면 -1이 반환된다고 나와 있습니다. 수정 된 경우에도 Ramp의 응답이 아마도 당신이 문제가있는 이유라고 생각합니다. http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStreamReader.html#read%28char[],%20int,%20int%29 – rui

+0

글쎄, InputStream은 허용되지 않습니다. 적어도 1 바이트가 요청되면 0을 반환하므로 'if (count> 0)'가 실제로 확인됩니다. – StaxMan

답변

3

코드를 검사했는데 문제가없는 것 같습니다. 그러나 당신은 char (2 바이트 타입)을 읽고 있다는 것을 명심해야한다 - 그래서 readData.length()는 바이트가 아닌 문자의 수를 보여줄 것이다. 테스트를하고 InputStreamReader를 BufferedInputStream으로 변경하고 버퍼 유형을 byte []로 변경했습니다. 코드는 예상 한 바이트 수를 정확하게 읽습니다.
Regads!

+0

문자 변환에 대한 근본적인 점은 유효하지만 2 바이트를 사용하는 문자에 대한 주석은 일반적으로 올바르지 않습니다. UTF-16/UCS-2 만 2 바이트 문자 인코딩으로 고정되어 있으며 일반적으로 사용되지 않습니다. 웹 서버. UTF-8은 가변 길이 인코딩입니다 (Java char 당 1 - 3 바이트). Latin-1은 char 당 1 바이트 고정되어 있습니다. – StaxMan

0

또한 대답을 추가하려면 : InputStreamReader가 사용할 문자 인코딩을 지정하지 않았기 때문에 코드 버그를 고려해야합니다. 이는 플랫폼 기본값이며 리소스가 사용하는 것과 다를 수 있습니다. 따라서 항상 명시 적으로 사용할 인코딩 ("UTF-8")을 지정하거나이 작업을 수행하는 라이브러리를 사용하십시오.

관련 문제