0

我正在尝试通过 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 调用了我的 servlet:

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

1)通过servlet即时处理输入,这是一种好的/常见的做法吗?

2)我的代码似乎删除了回车符 ('\n') 。为什么 ?

谢谢

4

1 回答 1

1

1)通过servlet即时处理输入,这是一种好的/常见的做法吗?

取决于功能要求。我个人会使用一个接受 HTTPmultipart/form-data请求而不是原始请求正文的 servlet。这样它就可以在普通的 HTML 表单上重用。

2)我的代码似乎删除了回车符 ('\n') 。为什么 ?

给定的代码示例没有这样做。也许你把它简化了,你最初是在使用BufferedReader#readLine()而不是在使用PrintWriter#println(). readLine()确实吃CRLF 。

给定的代码片段中也存在更多问题/效率低下,但我无法给出一个体面的答案,因为您似乎并没有真正运行您在问题中发布的代码。

于 2011-03-29T14:23:41.310 回答