我正在尝试连接到服务器,然后向其发送 HTTP 请求(在本例中为 GET)。这个想法是请求一个文件,然后从服务器接收它。
它应该适用于文本文件和二进制文件(例如 imgs)。我对文本文件没有问题,它工作得很好,但我对二进制文件有一些麻烦。
首先,我声明一个 BufferedReader (用于读取标头和文本文件)和一个数据输入流:
BufferedReader in_text = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
DataInputStream in_binary = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
然后,我使用 in_text 读取标题并发现它是文本文件还是二进制文件。如果它是一个文本文件,我会在 StringBuilder 中正确读取它。如果它是二进制文件,我声明一个 byte[filesize] 并存储 in_binary 的以下内容。
byte[] bindata = new byte[filesize];
in_binary.readFully(bindata);
但这不起作用。我收到 EOFException。
我想也许 in_binary 仍然位于流的第一个位置,所以它还没有读取标头。所以我捕获了标头的长度并跳过 in_binary 中的字节。
byte[] bindata = new byte[filesize];
in_binary.reset();
in_binary.skip(headersize);
in_binary.readFully(bindata);
而且还是一样。
可能发生什么情况?
Thanks!
PD:我知道我可以使用 URLConnection 等等。那不是问题。
BufferedReader
缓冲数据(因此得名)——几乎可以肯定,它会从套接字读取更多的数据,而不仅仅是标头。因此,当您尝试读取实际数据时,有些数据已经从套接字中读取。如果您尝试仅读取几个字节,您可能会发现它们不是实际响应数据的第一个字节。
如果你知道如何使用URLConnection
,我想知道你有什么理由不使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)