1

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

我怎样才能把这个文件放到我的安卓设备上?

我尝试了以下方法来获得byte[]...

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

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

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

需要明确的是,问题是:如何将这些数据直接流式传输到设备的存储中?

4

2 回答 2

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();
于 2013-04-12T15:50:08.940 回答
1

我猜这entity.getProperty("Data").getValue()实际上是返回一个byte[]or char[]。当您调用toString()一个数组(或者实际上,任何不覆盖的类型时toString(),您将获得一个由对象的类型名称和标识哈希码组成的短字符串。对于 abyte[]char[]可能是 7 个字符长。

我建议您打印出来entity.getProperty("Data").getValue().getClass()以确认实际类型。

于 2013-04-05T15:47:18.010 回答