【问题标题】:How to read byte by byte from appengine datastore Entity Object如何从 appengine 数据存储实体对象中逐字节读取
【发布时间】:2011-07-30 19:53:33
【问题描述】:

简而言之,由于 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());

    } 

欢迎您的建议。

问候

【问题讨论】:

  • 您是否尝试在客户端/服务器之间序列化 POJO?
  • 不!我基本上是在尝试将文件上传到 GAE,使用 GWT 作为客户端。在进行上传时,我想逐字节监控它,比如进度条或百分比读数。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多