Обработка InputStream для OutputStream на лету через HttpServlet
Я пытаюсь обработать большой текстовый файл через 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) обработка ввода на лету через сервлет, это хорошая / распространенная практика?
Зависит от функционального требования. Я бы лично использовал сервлет, который принимает HTTP multipart/form-data
запросы вместо необработанных тел запросов. Таким образом, его можно использовать в обычных HTML-формах.
2) мой код, кажется, удаляет возврат каретки ('\n') . Зачем?
Данный пример кода не делает этого. Может быть, вы упростили это и изначально использовали BufferedReader#readLine()
пока не пользуюсь PrintWriter#println()
, readLine()
действительно ест CRLF.
В данном фрагменте кода есть и другие проблемы / неэффективности, но я не могу дать на это достойный ответ, поскольку вы, похоже, на самом деле не запускаете код, который вы опубликовали в вопросе.