处理大型二进制文件,流式传输到存储

时间:2013-04-05 15:29:09

标签: java android odata4j

我正在使用Odata4j,我的实体有一个Data字段,这是一个二进制文件。通过浏览器查看时,它显示为Base64字符串。

如何将此文件存入我的Android设备?

我已尝试以下内容获取byte[] ...

String stringData = entity.getProperty("Data").getValue().toString();
byte[] data = Base64.decodeBase64(stringData);

但这只是给了我一个大约7个字节的小数组。但是,当我调试时,我可以看到entity数据具有较大的二进制值。

我还遇到第二个文件产生“内存不足”异常的问题,理想情况下我希望能够将此文件作为流/缓冲区直接下载到设备的存储中,这可能吗? / p>

要清楚,问题是:如何将这些数据直接传输到设备的存储空间?

2 个答案:

答案 0 :(得分:3)

我在不使用OData的情况下解决了这个问题。有一个可用的URL只返回二进制数据。因此,使用此URL,我可以使用其他Java类将数据直接流式传输到磁盘。

使用此网址:

  

www.example.com/OData.svc/File/Data/$value

(只返回二进制数据)

我们可以创建一个URL连接并下载它:

URL url = new URL(webPage);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

File file = new File(dir, fileName);//need to create a file based on your storage paths

FileOutputStream out = new FileOutputStream(file);
InputStream in = urlConnection.getInputStream();

byte[] buffer = new byte[1024];
int i = 0;
while ((i = in.read(buffer)) > 0) {
    out.write(buffer, 0, i);
}

out.flush();
out.close();
in.close();

答案 1 :(得分:1)

我猜测entity.getProperty("Data").getValue()实际上正在返回byte[]char[]。当你在一个数组上调用toString()时(实际上,任何不覆盖toString()的类型),你将获得一个由对象的类型名称和身份哈希码组成的短字符串。对于{{1或byte[],可能是7个字符。

我建议您打印char[]以确认实际类型。