2010-06-18 4 views
0

URL 콘텐츠를 바이트 단위로 읽으 려합니다. 나는 url의 내용에서 64kb를 읽어야한다.URL 콘텐츠를 읽으십시오.

public void readUrlBytes(String address) { 
    StringBuilder builder = null; 
    BufferedInputStream input = null; 
    byte[] buffer = new byte[1024]; 
    int i = 0; 
    try { 
     URL url = new URL(address); 
     URLConnection urlc = url.openConnection(); 
     input = new BufferedInputStream(urlc.getInputStream()); 
     int bytesRead; 
     while ((bytesRead = input.read(buffer)) != -1) { 
      builder.append(bytesRead); 
      if (i==64) { 
       break; 
      } 
      i++; 
     } 
     System.out.println(builder.toString()); 
    } catch (IOException l_exception) { 
     //handle or throw this 
    } finally { 
     if (input != null) { 
      try { 
       input.close(); 
      } catch(IOException igored) {} 
     } 
    } 

} 

위의 코드는 읽기 쉬운 문자입니다.

바이트를 읽어야합니다.

+0

당신은 무엇을 물어? java.io.InputStream.read() 메소드는 스트림에서'byte '를 읽는다. –

+0

붙여 넣은 새 코드를 살펴본 후 몇 가지 다른 문제가 있습니다. StrinngBuilder를 인스턴스화하지 않으므로 처음 사용하려고하면 NullPointerException이 발생합니다. 둘째로, append (byte [])를 호출 할 수없고 일어날 수있는 유용한 것을 기대할 수 없다. 바이트로 읽으려고한다고하지만, 모든 것이 끝난 후에 String을 얻으려는 것 같습니다. 이 바이너리 또는 문자 데이터를 읽으려고합니까? –

답변

0

캐스트를 char으로 제거하면 바이트가 생깁니다.

전체 내용을 메모리에 저장하려는 경우 ByteArrayOutputStream을 사용하여 각 바이트를 쓸 수 있습니다. 마지막 바이트의 배열을 얻기 위해 toByteArray() 전화 :

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
while ((byteRead = buffer.read()) != -1) { 
    baos.write(byteRead); 
} 

byte[] result = baos.toByteArray(); 

업데이트 : 당신이 64 킬로바이트 원하는 언급했다. 그건 그냥 baos.size() 당신은 단순히 InputStream 객체에서 직접 읽을 수 있습니다 * 1024 64 break

0

도달 여부를 확인 달성하기 위해 반환 : 나는 그것을 어떻게

InputStream istream = urlc.getInputStream(); 

    int byteRead; 
    while ((byteRead = istream.read()) != -1) 
    builder.append(byteRead); 

    istream.close(); 
+0

빌더가 StringBuilder 인 것으로 가정하므로 int를 쓰면 문자열 시퀀스에 추가됩니다. – Bozho

+0

방금 ​​질문 프로그램을 업데이트합니다. 프로그램을 실행할 때 오류가 발생합니다. –

+0

@Bozho - 좋은 지적입니다.하지만 대답하는 질문은 문자가 아닌 바이트를 읽는 방법이었습니다. 그러나 어쨌든 InputStream과 BufferedInputStream 모두 바이트를 읽었습니다. 나는 OP가 원했던 것이 지금 무엇인지 알고 있다고 생각합니다. 아래의 별도 답변을보십시오. – JTeagle

0

이는,

    input = urlc.getInputStream(); 
        byte[] buffer = new byte[4096]; 
        int n = - 1; 

        ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); 

        while ((n = input.read(buffer)) != -1) 
        { 
          if (n > 0) 
          { 
            baos.write(buffer, 0, n); 
          } 
        } 
        byte[] bytes = baos.toByteArray(); 
1

Bozho가 말했듯이, 당신은 이미 바이트로 읽고 있습니다. 그러나 한 번에 1 바이트 씩 수행하는 것이 아니라 바이트 배열로 모든 것을 읽는 것이 더 효율적입니다. 나는 OP가로 설정 특정 문자의 문자의 내부 형식을 나타내는 바이트의 스트림을 변환하고 싶은 생각 : 나는 갑자기 질문 해석 될 수있는 또 다른 방법을 깨달았

BufferedInputStream input = null; 
    byte[] buffer = new byte[4096]; 
    try { 
    URLConnection urlc = url.openConnection(); 
    input= new BufferedInputStream(urlc.getInputStream()); 
    int bytesRead; 
    while((bytesRead = input.read(buffer)) != -1) 
    { 
     //do something with the bytes, array has data 0 to bytesRead (exclusive) 
    } 
    } 
    catch(IOException l_exception) { 
     //handle or throw this 
    } 
    finally { 
    if (input != null) { 
     try { 
      input.close(); 
     } 
     catch(IOException igored) {} 
    } 
    } 
+0

재생에 대한 감사, 나중에, 이걸 알고, 하지만 난에서만 64kb의 내용을 읽고 싶어요. 가능합니까? –

+0

방금 ​​내 프로그램을 업데이트하지만 오류가 발생합니다. 왜? –

+2

나는 왜 당신이 오류 (태양 흑점 활동)를 얻고 있는지에 관해 추측 할 수는 있지만, 정확한 오류가 무엇인지 알려주면 진단하기가 더 쉽다. –

0

내가 별도의 답변을 추가 해요 해당 문자. 예를 들어, ASCII 코드를 ASCII 문자로 변환합니다.

이것은 완전한 대답은 아니지만 제대로 이해한다면 제대로 된 길에 OP를 넣을 것입니다. 여기 예를 들어 UTF-8을 사용하고 있습니다 :

BufferedInputStream istream = new BufferedInputStream(urlc.getInputStream()); 
int numBytesAvailable = istream.available(); 
byte[] buffer = new byte[numBytesAvailable]; 
istream.read(buffer); 

ByteBuffer tempBuffer = ByteBuffer.wrap(buffer); 
Charset utf8Chars = Charset.forName("UTF-8"); 
CharBuffer chars = utf8Chars.decode(tempBuffer); 

이제 자바를보고 같은 문자의 버퍼를 가지고, (당신은 그것에서 문자 []를 얻을 수 chars.array()를 사용할 수 있습니다) 그래서 문자열로 인쇄 할 수 있습니다.

경고 : 디코딩을 시도하기 전에 전체 스트림을 바이트 버퍼로 가져와야합니다. 문자의 내부 바이트 시퀀스의 올바른 끝을 모를 때 버퍼를 디코딩하면 문자가 손상됩니다!

0

첫 번째 64KB를 URL에서 byte[]으로 가져 오시겠습니까? 쉽게

:

public byte[] getFirst64KbFromUrl(String address) throws IOException { 
    InputStream input = null; 
    byte[] first64kb = new byte[64 * 1024]; 
    try { 
     input = new URL(address).openStream(); 
     input.read(first64kb); 
    } finally { 
     if (input != null) try { input.close(); } catch(IOException ignore) {} 
    } 
    return first64kb; 
} 

당신이 실제로String에 그 바이트를 변환에 문제가있는 경우, 여기 당신이 그것을 할 수있는 방법은 다음과 같습니다이 그러나 플랫폼의 기본 인코딩 소요

String string = new String(first64kb); 

계정에.Content-Type 응답 헤더에서 사용할 수있는 서버 쪽 인코딩을 사용하고 싶습니다.

URLConnection connection = new URL(address).openConnection(); 
// ... 
String contentType = connection.getHeaderField("Content-Type"); 
String charset = "UTF-8"; // Let's default it to UTF-8. 
for (String param : contentType.replace(" ", "").split(";")) { 
    if (param.startsWith("charset=")) { 
     charset = param.split("=", 2)[1]; 
     break; 
    } 
} 
// ... 
String string = new String(first64kb, charset); 

참조 :

관련 문제