将固定字节从输入流存储到字节数组中
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
(因为读者可以将字节转换为字符串,但我们不需要)。
然后可以使用BufferedInputStream
的read(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/。这应该是了解流、阅读器等的起点。
有关BufferedInputStream
和BufferedReader
的文档,请参阅它们的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