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

Posted

技术标签:

【中文标题】将固定字节从输入流存储到字节数组中【英文标题】:store fixed bytes into byte array from input stream 【发布时间】:2015-02-14 22:24:25 【问题描述】:

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

以下是我的代码,我们将不胜感激。

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

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

【问题讨论】:

如果你想处理字节那么你为什么要使用阅读器? (Reader 用于字符,InputStream 用于字节) @immibis 我不确定我需要如何解决这个问题。但我本质上想要做的是从流中读取字符,将它们存储到字节数组中,直到达到 100 个字节的数据。然后对这个数组做任何我想做的事情,并再次用下一组字符填充数组,直到字节数组中填充了 100 个字节的数据。你明白吗? 【参考方案1】:
    在你的while循环之外创建一个字节数组(你想要的大小)(你可以这样重复使用它,所以它更快)。 您可以使用BufferedInputStream 包裹在您原来的InputStream 周围而不是Reader(因为读者可以将字节转换为字符串,但我们不需要)。 然后可以使用BufferedInputStreamread(byte[])方法将下一系列字节复制到数组中。然后,您可以按照自己的方式处理检索到的字节。

请参阅 the API documentation 作为 read(byte[]) 所做工作的参考。

【讨论】:

你能解释一下第2步吗?如何在我的代码中实现 BufferedInputStream 而不是 BufferedReader?【参考方案2】:

如 cmets 中所述,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

【讨论】:

如何根据上面给出的代码设置 BufferedInputStream?你能再解释一下吗?很抱歉,我是 Java 的菜鸟,因此无法弄清楚它是如何工作的? 已更新。您可以通过指定套接字的输入流client.getInputStream() 来创建它,有点类似于您对BufferedReader 所做的方式。 这行得通!非常感谢。你能给我一些链接,我可以在其中阅读这两者的确切工作原理吗?我仍然不清楚 BufferedReader 或 BufferedInputStream 的实际作用。 当然。我刚刚添加了它们。

以上是关于将固定字节从输入流存储到字节数组中的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream

I/O输入输出--其他流

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

如何将类路径资源加载到字节数组?

《七》随机访问文件流

00090_字节输入流InputStream