Как читать побайтово из хранилища данных Appengine Entity Object - PullRequest
1 голос
/ 06 апреля 2011

В двух словах, поскольку 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();
  }

OneОбходной путь, который я пытался (не работал), заключается в получении данных из хранилища данных в виде ресурса, подобного следующему:

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 голосов
/ 07 апреля 2011

Храните данные в байтовом массиве и используйте ByteArrayInputStream или ByteArrayOutputStream для передачи их в библиотеки, ожидающие потоки.

Если под «клиентом» вы подразумеваете «HTTP-клиент» или браузер, хотяНет никаких причин делать это - просто работайте с обычными байтовыми массивами на своем конце и отправляйте их пользователю / от пользователя, как и любые другие данные.Единственная причина возиться с потоками, как это, если у вас есть библиотека, которая ожидает их.

...