我正在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我做错了什么,因为它没有得到所有的内容。任何帮助都将非常感激!
答案 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拆分成块?