Обработка InputStream для OutputStream на лету через HttpServlet - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь обработать большой текстовый файл с помощью HttpServlet (tomcat).

Поскольку этот файл может быть большим и процесс должен быть очень быстрым, я не хочу загружать файл насервер и я использовал метод HttpRequest.getInputStream для обработки ввода на лету.Например, я хочу преобразовать ввод в верхний регистр с кодом ниже:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class EchoServlet extends HttpServlet
    {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
        {
        OutputStream out=null;
        InputStream in=req.getInputStream();
        if(in==null) throw new IOException("input is null");
        try
            {
            resp.setContentType("text/plain");
            out=resp.getOutputStream();
            int c;
            while((c=in.read())!=-1)
                {
                out.write((char)Character.toUpperCase(c));
                }
            }
        catch(IOException err)
            {
            //ignore
            }
        finally
            {
            if(out!=null) out.flush();
            if(out!=null) out.close();
            in.close();
            }
        }
    }

Я вызвал свой сервлет с помощью CURL:

curl -s -d @big.file.txt  "http://localhost:8080/test/toupper"

1) обрабатывая ввод налетать через сервлет, это хорошая / распространенная практика?

2) мой код, похоже, удаляет возврат каретки ('\ n').Почему?

Спасибо

1 Ответ

1 голос
/ 29 марта 2011

1) обработка ввода на лету через сервлет, это хорошая / распространенная практика?

Зависит от функциональных требований. Я бы лично использовал сервлет, который принимает HTTP multipart/form-data запросы вместо необработанных тел запросов. Таким образом, его можно использовать в обычных HTML-формах.

2) кажется, мой код удаляет возврат каретки ('\ n'). Почему?

Данный пример кода не делает этого. Возможно, вы упростили его и изначально использовали BufferedReader#readLine(), а не PrintWriter#println(). readLine() действительно ест CRLF.

В данном фрагменте кода есть и другие проблемы / неэффективности, но я не могу дать достойного ответа на этот вопрос, поскольку вы, похоже, не на самом деле запускаете код, который вы опубликовали в вопросе .

...