2011-03-29 111 views
0

我試圖通過HttpServlet(tomcat)處理大文本文件。通過HttpServlet處理InputStream到OutputStream

由於此文件可能很大,並且進程應該非常快,因此我不想在服務器上上傳文件,並且我使用方法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(); 
      } 
     } 
    } 

我調用我的servlet與CURL:通過servlet

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

1)處理在運行中輸入,這是一種很好/常見的做法嗎?

2)我的代碼似乎刪除回車('\ n')。爲什麼?

由於

回答

1

1)通過servlet處理在運行中輸入,它是一個良好的/常見的做法?

取決於功能要求。我個人會使用一個接受HTTP multipart/form-data請求而不是原始請求主體的servlet。這樣它就可以在普通的HTML表單中重用。

2)我的代碼似乎刪除回車符('\ n')。爲什麼?

給定的代碼示例沒有這樣做。也許你已經簡化了它,你最初使用BufferedReader#readLine()而不使用PrintWriter#println()readLine()確實吃CRLFs。

在給定的代碼片段中還有更多問題/效率低下,但我不能給出一個體面的答案,因爲你似乎沒有實際上運行你在問題中發佈的代碼。

+0

「我的代碼沒有這樣做」,是的,但是'\ n'已經在curl的輸出中刪除了。我剛剛從我的代碼中刪除了該軟件包的名稱。 – Pierre 2011-03-29 14:26:21

+0

我在閱讀您的答案後查看了http://commons.apache.org/fileupload/streaming.html。謝謝。 – Pierre 2011-03-29 14:59:54

+0

我在本地嘗試了您的servlet代碼(儘管使用'java.net.URLConnection'代替curl),並且保留了換行符。 – BalusC 2011-03-29 15:04:19

相關問題