我在C#中调用servlet,这个servlet每天响应几千个请求,但只是几次到10来次报错,我现在连调试都没法做,唉
 
servlet的代码如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
Connection conn= null;
String cetifyResult =null;
StringBuilder requestData = new StringBuilder();
try {
BufferedReader reqIn = request.getReader();      按照JAVA报错信息,81行指的就是这句


。错误信息为:
java.io.UnsupportedEncodingException: 'utf-8'
at sun.nio.cs.StreamDecoder.forInputStreamReader(Unknown Source)
at java.io.InputStreamReader.<init>(Unknown Source)
at org.apache.tomcat.util.buf.ReadConvertor.<init>(B2CConverter.java:198)
at org.apache.tomcat.util.buf.B2CConverter.reset(B2CConverter.java:117)
at org.apache.tomcat.util.buf.B2CConverter.<init>(B2CConverter.java:56)
at org.apache.catalina.connector.InputBuffer.setConverter(InputBuffer.java:543)
at org.apache.catalina.connector.InputBuffer.checkConverter(InputBuffer.java:510)
at org.apache.catalina.connector.Request.getReader(Request.java:1152)
at org.apache.catalina.connector.RequestFacade.getReader(RequestFacade.java:470)
at org.ea.test.LicenseCertificationServlet.doPost(LicenseCertificationServlet.java:81)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:774)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:896)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

    http://blog.csdn.net/maxracer/article/details/5436580看看这个能不能解决你的问题。。然后这样改试试:
    InputStreamReader isr = new InputStreamReader(request.getInputStream(), "UTF-8");
    BufferedReader read = new BufferedReader(isr);
      

  2.   

    我按照你的写法改了代码后观察了几天,发现出现了另一个报错,不过也是每天只有几个,改了后的代码如下:
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    Connection conn= null;
    String cetifyResult =null;
    StringBuilder requestData = new StringBuilder();
    try {
    InputStreamReader isr = new InputStreamReader(request.getInputStream(), "UTF-8");
    BufferedReader reqIn = new BufferedReader(isr);
    String readline = null;
    while((readline = reqIn.readLine())!=null ) (这句报错,错误信息见下文)
    requestData.append(readline);错误信息为:
    java.io.IOException: Underlying input stream returned zero bytes
      

  3.   

    在类中每一个方法体中首先加入request.setCharacterEncoding("UTF-8"),然后再写下面的,因为只要牵涉到dopost和doget的都需要转码,所以你第一步需要做的就是转码,然后再写下面的代码。
      

  4.   


    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    InputStream in = request.getInputStream();
    int bytesRead = 0;
    while ((bytesRead = in.read()) != -1) {
    try {
    bos.write(bytesRead);
    } catch (Exception e) {
    }
    }
    byte[] bt = bos.toByteArray();
    System.out.println(new String(bt, "GBK"));
    bos.close();这样试试呢、?
      

  5.   

    上面忘记加关闭in了:in.close()最后关闭
      

  6.   

    字符编码要用GBK吗?不是utf-8吗?
      

  7.   

    GBK的话,中文不会乱码。。代码我试过的utf-8中文乱码了。。所以我用的GBK
      

  8.   

    我们传的值没有中文的,所以我还是保持了utf-8编码我再观察一、两天看看,谢谢了
      

  9.   

    TO:junerkele我后续的处理也是以UTF-8编码处理的,目前还没考虑转码
      

  10.   


    while ((bytesRead = in.read()) != -1) {
    上面这句报错:
    java.lang.ArrayIndexOutOfBoundsException: 8192
      

  11.   


    我想问你是想采用哪种方式来读写流!!
    如果是用byte数组,为什么没有看到数组的定义,如果是单个byte传递的话,为什么会是!=-1   应该是 != null才对吧!!!
      

  12.   

    TO:Canace_lemon我是按照上面高手给的代码写的,至于为什么是这样我也不清楚。不过我测试时用这个代码是可以正常取到数据的,而且这个Servlet每天响应几千次,观察两天就只出现过一次报错或者你有什么更好的办法解决我的问题,望赐教,谢谢
      

  13.   


    我的建议是你能改成byte数组传输,这样效率会高一些!!
    就是将int bytesRead = 0;
    这一句改成Byte [] bytes  = new byte[1024];
    你先这样试试!!
      

  14.   

    我上午用
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                InputStream in = request.getInputStream();
                int bytesRead = 0;
                while ((bytesRead = in.read()) != -1) {
                    try {
                        bos.write(bytesRead);
                    } catch (Exception e) {
                    }
                }
                byte[] bt = bos.toByteArray();
                System.out.println(new String(bt, "GBK"));
                bos.close();
    这段代码 跑了一上午。。循环调用100000次。去读取3.5MB的txt文件也没出现问题啊,,怀疑是不是你的数据有什么特殊性。。或者丢失数据现象
      

  15.   


    Canace_lemon说的是这样。。我开始忽略了这种的效率问题。。LZ可以换成这种。。int bytesRead = 0;
        //都是用输入流进行先读,然后用输出流去写,用的是缓冲输入输出流
        byte[] buffer = new byte[8192];
        while ((bytesRead = in.read(buffer, 0, 8192)) != -1)  {
         try{
         bos.write(buffer, 0, bytesRead);
         }catch(Exception e){}
        }
    byte[] bt = bos.toByteArray();
    System.out.println(new String(bt, "GBK"));
    bos.close();
    in.close();