HTTP:如何从BufferedHttpEntity正确读取数据

时间:2014-02-24 09:05:11

标签: java http stream entity

我正在java中开发一个基于HTTP的客户端 - 服务器应用程序。我有一个客户端程序和一个serer程序。基本上,客户端通过Http发送文件,但在读取数据时我在服务器端遇到问题。如果我发送的文件大于8KB,我只会在服务器端获得前8KB的字符。我在stackoverflow上搜索了类似的问题,结果发现实体是缓冲的,所以我必须使用BufferedHttpEntity。这是我的代码:

BufferedHttpEntity buffEntity = new BufferedHttpEntity(entity);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

buffEntity.writeTo(baos);
while (buffEntity.isStreaming()) {
    buffEntity.writeTo(baos);
}

Log.i("Data received", baos.toString());

问题是我发送了一个16KB的文件,控制台中显示的最后一个字母位于文档的一半。我真的不知道如何阅读缓冲实体的其余部分。但是,如果我将实体的内容写入文件(如下所示),它的工作正常,所以很奇怪:

File f = new File("mnt/sdcard/file.txt");
FileOutputStream os = new FileOutputStream(f);

buffEntity.writeTo(os);
while (buffEntity.isStreaming()) {
    buffEntity.writeTo(os);
}

在此步骤之后,如果我查看“mnt / sdcard / file.txt”,则文件已完成(不会丢失任何字符)。我不知道ByteArrayOutputStream我做错了什么,因为它没有得到所有的内容。任何帮助都将非常感激!

2 个答案:

答案 0 :(得分:1)

尝试使用如下的InputStream读取BufferedHttpEntity:

   HttpEntity entity = httpResponse.getEntity();

BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);

InputStraem is = bufHttpEntity .getContent() ; 

ByteArrayOutputStream bOutput = new ByteArrayOutputStream(is.available() );


int nRead;
byte[] data = new byte[is.available()];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

buffer.flush();

请给我一些反馈。

希望有助于。

答案 1 :(得分:0)

我终于设法找到了这个问题。我尝试在PC上的java程序上做同样的事情,并且使用ByteArrayOutputStream它工作得很好,我收到了整个内容。但在Android上,我只收到了一份文件。我认为这是Android的一些限制,因为使用ByteArrayOutputStream它将内容保存在内存中,所以如果我收到1GB的内容它不是很方便,所以它是有道理的。在FileOutputStream的情况下没有问题,因为内容没有保存在内存中,它直接写在文件中。

有没有人知道如何将内容从BufferedHttpEntity拆分成块?