2010-06-18 3 views
0

Я хочу прочитать содержимое URL по байтам. Я должен прочитать 64 kb из содержимого URL.читать содержимое 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 []) и ожидать чего-нибудь полезного. Вы говорите, что хотите читать в байтах, но кажется, вы пытаетесь получить строку после того, как все будет сказано и сделано. Являются ли эти двоичные или символьные данные, которые вы пытаетесь прочитать? –

ответ

0

Если вы удалите литье до char, у вас есть байт.

Если вы собираетесь хранить весь контент в памяти, вы можете использовать ByteArrayOutputStream и написать каждый байт. Наконец называют toByteArray(), чтобы получить массив байтов:

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

byte[] result = baos.toByteArray(); 

Update: вы упомянули, вы хотите только 64 кб. Для достижения этой цели просто проверить, был ли baos.size() достиг 64 * 1024 и break

0

Вы можете просто прочитать непосредственно из объекта InputStream вернулся:

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

Как сказал Божо, вы уже читаете в байтах. Однако, вероятно, более эффективно читать все в байтовый массив, а не делать это по одному байту за раз.

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

спасибо за повтор, ya, я знаю это, , но я хочу читать только 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); 

Теперь у вас есть буфер символов, как Java видит их (вы можете использовать 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); 

Смотрите также:

Смежные вопросы