阅读网址内容

时间:2010-06-18 14:46:35

标签: java

我想按字节读取网址内容。我必须从url的内容中读取64 kb。

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 个答案:

答案 0 :(得分:1)

像Bozho所说,你已经在读字节了。但是,将所有内容读入字节数组而不是一次只执行一个字节可能更有效。

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) {}
     }
  }

答案 1 :(得分:0)

如果将演员表移除到char,则会有一个字节。

如果要将整个内容存储到内存中,可以使用ByteArrayOutputStream并将每个字节写入其中。最后调用toByteArray()以获取字节数组:

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

byte[] result = baos.toByteArray();

更新:您提到您只想要64 kb。要实现这一点,只需检查baos.size()是否已达到64 * 1024和break

答案 2 :(得分:0)

您可以直接从返回的InputStream对象中读取:

  InputStream istream = urlc.getInputStream(); 

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

  istream.close(); 

答案 3 :(得分: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();

答案 4 :(得分:0)

我正在添加一个单独的答案,因为我突然意识到可以解释问题的另一种方式:我认为OP想要将表示特定字符​​集中字符的内部格式的字节流转换为相应的字符。例如,将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的缓冲区,因为Java看到它们(你可以使用chars.array()从中获取一个char []),因此它们可以打印成一个字符串。

警告:在尝试解码之前,您需要将整个流转换为字节缓冲区;当你不知道字符的内部字节序列的正确结束时解码缓冲区将导致字符损坏!

答案 5 :(得分: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);

另见