читать содержание URL - PullRequest
0 голосов
/ 18 июня 2010

Я хочу прочитать содержимое URL в байтах.Я должен прочитать 64 КБ из содержимого 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) {}
        }
    }

}

Приведенная выше кодировка предназначена для чтения символов.

Мне нужно прочитать байты.

Ответы [ 6 ]

1 голос
/ 18 июня 2010

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

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 голосов
/ 21 июня 2010

Вы хотите получить первый 64 КБ из 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;
}

Если вы на самом деле *У 1010 * есть проблема с преобразованием этих байтов в 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);

См. Также :

0 голосов
/ 18 июня 2010

Я добавляю отдельный ответ, поскольку внезапно понял, что вопрос можно интерпретировать иначе: я думаю, что ОП хочет преобразовать поток байтов, представляющих внутренний формат символов в определенном наборе символов, в соответствующие символы. Например, преобразование кодов ASCII в символы ASCII.

Это не полный ответ, но, надеюсь, поставит ОП на правильный путь, если я правильно понял. В качестве примера я использую 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 (), чтобы получить из него char []), чтобы они могли быть напечатаны в виде строки.

ПРЕДУПРЕЖДЕНИЕ. Перед тем, как приступить к декодированию, вам потребуется поместить весь поток в байтовый буфер; декодирование буфера, когда вы не знаете правильный конец внутренней последовательности байтов символа, приведет к повреждению символов!

0 голосов
/ 18 июня 2010

Вот как я это сделал,

                    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();
0 голосов
/ 18 июня 2010

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

  InputStream istream = urlc.getInputStream(); 

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

  istream.close(); 
0 голосов
/ 18 июня 2010

Если вы удалите приведение к char, у вас есть байт.

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

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

byte[] result = baos.toByteArray();

Обновление: Вы упомянули, что хотите только 64 КБ. Для этого просто проверьте, достигло ли baos.size() 64 * 1024 и break

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...