如果我请求读取文件的整个长度,在android上从表示文件的输入流中读取文件时,是否有任何理由说明为什么我的字节数组只能在调用后部分填充?我可以用android在java中读取整个文件吗?
1
A
回答
1
Java流中的read(byte[])
方法读取的字节数可能少于请求的字节数。
通过在互联网上的文件我假设你的意思是一个HTTP URL的内容。
某些HTTP响应不会预先给出Content-Length,也不能像预先分配正确大小的字节数组。
您可能有兴趣知道Android上可用的Apache http客户端库已经提供了一个辅助方法EntityUtils.toByteArray()
,它可以完全获取URL的内容并将其作为正确大小的字节数组返回。
下面是使用它的一段代码:
public byte[] fetchURL(String url) throws IOException, ClientProtocolException {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
return EntityUtils.toByteArray(entity);
}
注意阅读在内存中的整个反应并不总是最好的解决方案。向用户报告下载进度或递增解析大文档可能更好。事实上,响应甚至可能不适合RAM(例如大视频流)。
1
正常的读命令会读取一些字节数直到请求的长度。程序员应该对返回值进行检查(告诉你读了多少字节)。还有readFully方法,它强制它读取所需的全部长度,但是这可能会阻塞很长一段时间,从而阻止您在阅读大量流的过程中突然中断。
1
是否有任何理由为什么我的字节数组应该只在调用后部分填充?
是的。所以你的android应用程序不需要等待整个流下载,然后从read
呼叫返回。
在你的特定用例中,这显然是一个讨厌的东西。在其他用途的情况下,它是read
行为这样一个关键要求:
应用程序可能需要启动处理和交付成果的用户在远程服务器仍然是发送数据。
在发送更多数据之前,远程服务器实际上可能正在等待来自客户端的某种应用程序级响应。 (如果您使用的是HTTP或FTP,这不适用,但是您正在阅读的流可能会封装一个传输层Socket流,并且在那个级别上对任何表示层协议细节都没有任何了解。)
的解决方案是:
- 使用一个循环,并保持阅读,直到
read
返回零。 - 如果您使用的是Apache HttpClient,有许多方法可以获取响应的全部内容。
- Apache Commons包含一个IOUtils类,它具有读取整个流或读取器的辅助方法。
顺便说一下,这种行为在read(byte[], ...)
方法的javadoc中明确指定。
相关问题
- 1. android:我可以用xmlparser读取一个xhtml文件吗?
- 2. 我可以在java中读取windows-1256文件吗?
- 3. 我可以从Java读取BerkeleyDB(非Java版本)文件吗?
- 4. 我可以读取Mongo Shell JavaScript文件中的csv文件吗?
- 5. 我可以在我的java代码中读取htop输出吗?
- 6. 我可以使用从文件中读取的testng组吗?
- 7. 我可以使用MPI中的API读取远程文件吗?
- 8. 我可以在FastReport中读取RTF吗?
- 9. 可以使用java从android sdcard读取文件
- 10. 我可以用PHP读取.TXT文件吗?
- 11. 我可以使用Webassembly从磁盘读取文件吗?
- 12. 我可以从我的私人文件夹读取内容吗?
- 13. 从Java中的文件读取整数
- 14. 如何逐行读取一个文本文件,并将每行存储在数组中使用android?可以在android中读取xls文件吗?
- 15. 在Scala中读取整个文件?
- 16. 我可以使用Outlook Redemption在C++中读取/呈现MSG文件吗?
- 17. 我可以用php上传整个文件夹吗?
- 18. 我可以使用GDB跳过整个文件(malloc.c等)吗?
- 19. 我可以使用spark-submit发送整个文件夹吗?
- 20. 可以通过java inputstream读取正在内存中更新的文件吗?
- 21. 可以用cURL从PHP文件中读取PHP代码吗?
- 22. Ruby可以读取在VB.NET中创建的.dat文件吗?
- 23. 我可以简单地'阅读'正在使用的文件吗?
- 24. 我可以写入一个新文件,然后在同一个C程序中读取该文件吗?
- 25. 我可以在android只读文件系统中拥有写入权限吗?
- 26. 我可以允许多个程序同时读取同一个文件吗?
- 27. 在Java中读取多个文件
- 28. 用户可以阅读此文件吗?
- 29. 是否可以使用JAVA从文件中读取/写入位?
- 30. cvs中的文件可以只读吗?