如何从appengine数据存储区实体对象逐字节读取

时间:2011-04-06 13:11:50

标签: google-app-engine servlets google-cloud-datastore

简而言之,由于GAE无法写入文件系统,因此我决定将数据保存到数据存储区(使用JDO)。现在,我想逐字节检索数据并将其作为输入流传递给客户端。来自gwtupload库(http://code.google.com/p/gwtupload/)(见下文)的代码在GAE上打破,因为它写入系统文件系统。我希望能够提供GAE移植解决方案。

public static void copyFromInputStreamToOutputStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[100000];
    while (true) {
      synchronized (buffer) {
        int amountRead = in.read(buffer);
        if (amountRead == -1) {
          break;
        }
        out.write(buffer, 0, amountRead);
      }
    }
    in.close();
    out.flush();
    out.close();
  }

我尝试过的一项工作(不起作用)是从数据存储中检索数据,如下所示:

InputStream resourceAsStream = null;
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
        Query q = pm.newQuery(ImageFile.class);
        lf  = q.execute();
        resourceAsStream = getServletContext().getResourceAsStream((String) pm.getObjectById(lf));
    } finally {
      pm.close();
    }
    if (lf != null) {
      response.setContentType(receivedContentTypes.get(fieldName));
      copyFromInputStreamToOutputStream(resourceAsStream, response.getOutputStream());

    } 

我欢迎你的建议。

此致

1 个答案:

答案 0 :(得分:0)

将数据存储在字节数组中,并使用ByteArrayInputStreamByteArrayOutputStream将其传递给期望流的库。

如果“客户端”指的是“HTTP客户端”或浏览器,则没有理由这样做 - 只需在您的终端处理常规字节数组,并像发送其他任何数据一样将数据发送给用户。如果你有一些期望它们的库,那么弄乱像这样的流的唯一理由就是。