Запись в файлы CSV, а затем архивирование в Appengine (Java) - PullRequest
4 голосов
/ 26 февраля 2011

В настоящее время я работаю над проектом, который выполняется на Java, в Google Appengine.

Appengine не позволяет хранить файлы, поэтому любые объекты представления на диске не могут быть использованы. Некоторые из них включают класс File.

Я хочу записать данные и экспортировать их в несколько CSV-файлов, а затем сжать их и позволить пользователю загрузить их.

Как я могу сделать это без использования классов File? Я не очень опытен в обработке файлов, поэтому надеюсь, что вы, ребята, можете посоветовать мне.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 26 февраля 2011

Вы можете создать zip-файл и добавить к нему, пока пользователь загружает его. Если вы используете сервлет, это просто:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // ..... process request

    // ..... then respond
    response.setContentType("application/zip");
    response.setStatus(HttpServletResponse.SC_OK);

    // note : intentionally no content-length set, automatic chunked transfer if stream is larger than the internal buffer of the response
    ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());

    byte[] buffer = new byte[1024 * 32];
    try {
            // case1: already have input stream, typically ByteArrayInputStream from a byte[] full of previoiusly prepared csv data

            InputStream in = new BufferedInputStream(getMyFirstInputStream());
            try {
                zipOut.putNextEntry(new ZipEntry("FirstName"));

                int length;
                while((length = in.read(buffer)) != -1) {
                    zipOut.write(buffer, 0, length);
                }

                zipOut.closeEntry();
            } finally {
                in.close();
            }

            // case 2: write directly to output stream, i.e. you have your raw data but need to create csv representation

            zipOut.putNextEntry(new ZipEntry("SecondName"));

            // example setup, key is to use the below outputstream 'zipOut' write methods
            Object mySerializer = new MySerializer(); // i.e. csv-writer
            Object myData = getMyData(); // the data to be processed by the serializer in order to make a csv file

            mySerizalier.setOutput(zipOut);

            // write whatever you have to the zipOut
            mySerializer.write(myData);

            zipOut.closeEntry();

            // repeat for the next file.. or make for-loop

        }
    } finally { 
        zipOut.close();
    }
}

Нет причин хранить ваши данные в файлах, если у вас нет ограничений памяти. Файлы дают вам InputStream и OutputStream, оба из которых имеют эквиваленты в памяти.

Обратите внимание, что создание модуля записи в csv обычно означает выполнение чего-то вроде this , где смысл состоит в том, чтобы взять часть данных (список массивов или карту, что у вас есть) и превратить их в части байта [] , Добавьте части byte [] в OutputStream с помощью такого инструмента, как DataOutputStream (создайте свой собственный, если хотите) или OutputStreamWriter.

3 голосов
/ 26 февраля 2011

Если ваши данные не велики, то есть они могут оставаться в памяти, тогда экспорт в CSV и архивирование и потоковая передача для загрузки могут быть выполнены на лету.Кэширование может выполняться на любом из этих этапов, что в значительной степени зависит от бизнес-логики вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...