I'm trying to process a large text file through a HttpServlet (tomcat).

As this file can be large and the process should be very fast, I don't want to upload the file on the server and I've used the method HttpRequest.getInputStream to process the input on the fly. For example, I want to transform the input to upper-case with the code below:

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();
            }
        }
    }

I invoked my servlet with CURL:

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

1) processing the input on the fly through a servlet, is it a good/common practice ?

2) my code seems to remove the carriage return ('\n') . Why ?

Thanks

有帮助吗?

解决方案

1) processing the input on the fly through a servlet, is it a good/common practice ?

Depends on the functional requirement. I would personally have used a servlet which accepts HTTP multipart/form-data requests instead of raw request bodies. This way it's reuseable on normal HTML forms.

2) my code seems to remove the carriage return ('\n') . Why ?

The given code example doesn't do that. Maybe you've oversimplified it and you was originally using BufferedReader#readLine() while not using PrintWriter#println(). The readLine() indeed eats CRLFs.

There are more issues/inefficiencies in the given code snippet as well, but I can't give a decent answer on that as you seem not to actually be running the code as you posted in the question.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top