将固定字节存储到输入流的字节数组中

时间:2015-02-14 22:24:25

标签: java bytearray bufferedreader bytebuffer

我正在尝试学习Java,我遇到了这个练习题,我必须创建一个URL提取器。我能够流式传输数据并进行打印。但是我并不熟悉缓冲读卡器因此我需要帮助创建一个100字节的缓冲区,将100字节的数据从流复制到这个字节数组,然后处理这部分,然后从下一个100字节的块中取出流等等......

以下是我的代码,非常感谢任何帮助。

我知道我想要的东西需要在while循环中完成。我想我需要创建一个字节数组,然后将数据存储到其中。这是我对此更感兴趣的方式。

编辑:我不需要任何代码示例,因为我正在努力学习。只有我如何能做到这一点的描述就足够了。非常感谢提前。

2 个答案:

答案 0 :(得分:0)

  1. 在while循环之外创建一个字节数组(大小你想要)(你可以这样重用它,所以它更快)。
  2. 您可以使用原始BufferedInputStream而非InputStream的{​​{1}}(因为读者可以将字节转换为字符串,但我们不需要)。
  3. 然后,您可以使用Reader的{​​{1}}方法将下一系列字节复制到数组中。然后,您可以按照自己的方式处理检索到的字节。
  4. 请参阅the API documentation作为read(byte[])所做的参考。

答案 1 :(得分:0)

如评论中所述,Reader(及其子类BufferedReader)用于读取字符而不是字节。您应该使用BufferedInputStream来读取指定大小的字节数组:

public static void main(String[] args) throws IOException {
    String website = "thecakestory.com";
    Socket client = new Socket(InetAddress.getByName(website), 80);

    PrintWriter pw = new PrintWriter(client.getOutputStream());

    pw.println("GET /index.php / HTTP/1.1\r\n");
    pw.println("Host: " + website);
    pw.flush();

    BufferedInputStream input = new BufferedInputStream(client.getInputStream());

    String x;
    int bytesRead;
    byte[] contents = new byte[100];
    while ((bytesRead = input.read(contents)) != -1) {
        x = new String(contents, 0, bytesRead);
        System.out.print(x);
    }

    client.close();
    pw.close();

}

一些有用的链接:

有关Java IO相关内容的介绍,请参阅Java教程页面http://docs.oracle.com/javase/tutorial/essential/io/。这应该是了解流,读者等的起点。

有关BufferedInputStreamBufferedReader的文档,请参阅其API参考:

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html