我在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)
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)
InputStreamReader isr = new InputStreamReader(request.getInputStream(), "UTF-8");
BufferedReader read = new BufferedReader(isr);
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
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();这样试试呢、?
while ((bytesRead = in.read()) != -1) {
上面这句报错:
java.lang.ArrayIndexOutOfBoundsException: 8192
我想问你是想采用哪种方式来读写流!!
如果是用byte数组,为什么没有看到数组的定义,如果是单个byte传递的话,为什么会是!=-1 应该是 != null才对吧!!!
我的建议是你能改成byte数组传输,这样效率会高一些!!
就是将int bytesRead = 0;
这一句改成Byte [] bytes = new byte[1024];
你先这样试试!!
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文件也没出现问题啊,,怀疑是不是你的数据有什么特殊性。。或者丢失数据现象
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();