Linux, java.lang.Process.getOutputStream() funniness

Hi,
I'm using RedHat 7.1, and Sun JDK 1.3.0_02 (on Intel).
From my Java app, I'm trying to launch another process, and redirect my
console in/out to the slave process's in/out.
After launching the process (using Runtime.exec), I launch three
background threads:
1. Monitor the slave process's getInputStream and write all incoming
bytes to my System.out
2. Monitor the slave process's getErrorStream and write all incoming
bytes to my System.out
3. Monitor my System.in and write all incoming bytes to the slave
process's getOutputStream
The funniness I'm experiencing is in step 3 -- it seems that I have to
press each keystroke TWICE, for it to register into the slave process.
For example, as a test, I am launching "lynx http://www.cnn.com", and
the lynx options "H" and "O" I have to press twice (H-H or O-O) to get
the appropriate screen to pop up. In fact, the first keystroke I enter
doesn't matter; it's as if every other keystroke is looked at.
Here is my code for thread #3:
// -------- Begin code fragment
// Start an input thread
Thread inThread = new Thread() {
   public void run() {
      OutputStream out = slaveProcess.getOutputStream();
      byte[] buffer = new byte[1024];
      int len;
      while (true) {
         try {
            len = System.in.read(buffer);
            if (len == -1) break;
            //System.out.println("Bytes read from keyboard: " + len);
            out.write(buffer, 0, len);
            out.flush();
         } catch (Exception e) {
            break;
      System.out.println("inThread exiting");
inThread.start();
// -------- end code fragment In reference to some older JVM bugs, I've tried inserting
Thread.currentThread().sleep(1) at various points (in case there is a
scheduler problem), but to no avail.
Any help would be appreciated!
Thank you,
Bryan

I would test it buy using three FileIn/OutputStreams
instead of Syatem.in/out/err and if it worked at that
point it would be the synchronization/blocking problem.
Because I have used Process.getInputStream on linux on
several occasions and never anything like you are
talking about happened.

Similar Messages

  • Java.lang.Process input stream waiting until process is complete to print

    I have tried to simplify this problem as much as possible. Basically, I have a java.lang.Process which executes a simple C program.
    test.c
    #include <stdio.h>
    #include <unistd.h>
    int main()
      printf("foo\n");
      sleep(2);
      printf("bar\n");
    ...The process has an input stream and error stream handler each on a separate thread. I have tried both buffered and unbuffered (BufferedReader, BufferedInputStream, InputStreamReader...) stream handlers. Both produce the same problem of waiting until the process has exited to receive anything from the process's streams.
    The only time this does not happen is when I call fflush(stdout); after each printf(). This can't be a solution because the real application calls a massive C application which would require thousands of fflush()'s to be added. What is causing this to happen? This doesn't happen when the C program is executed from the shell. Is there a way the InputStream can be forced to extract from the stream?

    hi.....
    I have closed the output stream of the process as you told me to do...
    The hitch is that, if my program contains only printf() statements,it works fine
    as soon as scanf() statement is encountered within the C code,it is totally neglected,and the output comes as if no scanf() statement existed in the C code.
    Consequently the thread doesnt wait for input which was bound for scanf() from the thread
    the code...
        public void run()
         try
             PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
             BufferedReader in = new BufferedReader(
                            new InputStreamReader(
                            socket.getInputStream()));
             try
                     Process p;
              p=new ProcessBuilder("./a.out").start();
                     PrintWriter exOut=null;
                     BufferedReader exIn=null;
              exOut = new PrintWriter(p.getOutputStream(),true);
              exIn = new BufferedReader(
                           new InputStreamReader(
                           p.getInputStream()));
                  //String inputLine="", outputLine="";        
                  String str="";
                     int c;          
                  while(true)                   
                        //System.out.println("In While");
                  str="";exOut.close();                  
                        while((c=exIn.read())!=-1)
                                 str=str+(char)(c);
                                    System.out.print(str);
                        str=str+(char)(0);
                        System.out.print(str+"outside");
                        out.print(str);
                        sleep(100);
                        try
                            int x=p.exitValue();
                              out.print(str);
                   System.out.print("Bye 1");
                            String str1="Bye"+(char)(0);
                   out.println(str1);              
                   break;
                        catch(IllegalThreadStateException e)
                            //System.out.println("The Process has not ended yet");
                        //str=str+((char)-1);
                        //System.out.print(str+"Control reaches here too");
                        str="";
                        exOut = new PrintWriter(p.getOutputStream(),true);//I have tried to run the program without this also but the effect is the same
                        while((c=in.read())!=-1)
                            str=str+(char)(c);                                    
                        if(str.contentEquals(""))
                                System.out.print("Bye 2");
                                String str1="Bye"+(char)(0);
                                out.println(str1); 
                                p.destroy();
                                exOut.close();
                                exIn.close();
                                out.close();
                                in.close();        
                                socket.close();
                                break;
                        //str=str+(char)(0);
                  exOut.print(str);
                        try
                            int x=p.exitValue();
                            System.out.print("Bye 3");
                            String str1="Bye"+(char)(0);
                   out.println(str1);
                            break;
                        catch(IllegalThreadStateException e)
                            //System.out.println("The Process has not ended yet");
                  /*while ((inputLine = in.readLine()) != null)
                        exOut.println(inputLine);
                        outputLine=exIn.readLine();
                        //outputLine=inputLine;
                        //out.println(outputLine);}*/                   
             exOut.close();
             exIn.close();
             catch(IOException e)
                  System.err.println("Accept failed."+e);
             out.close();
             in.close();        
             socket.close();
         catch (Exception e)
             e.printStackTrace();
    }

  • Java.lang.process.execute()

    Java.lang.process.execute() is throwing an exception with string �Cannot allocate memory� ...
    what is the cause of this exception and give me the solution
    plz help
    Nilesh

    882590 wrote:
    Is it possible to use the java.lang.ProcessBuilder to execute a Java process pointing it to jvm.dll instead of java.exe? I'm using the JavaFX self contained application packaging and it creates a runtime/jre/bin directory that contains jvm.dll, but not java.exe.I don't get the line of questioning of this thread. If you're using the JavaFX stuff the answer must lie in the JavaFX documentation. It seems to indicate that it generates an executable of its own which will likely wrap the jvm DLL, so you should be invoking the generated executable in ProcessBuilder.
    http://docs.oracle.com/javafx/2/deployment/self-contained-packaging.htm

  • Java.lang.Process.exec()

    I have read a article about the "java.lang.Process.exec()" (url:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html)
    Having some questions with the example in it.
    The example code:
    import java.util.*;
    import java.io.*;
    public class BadExecJavac
        public static void main(String args[])
            try
                Runtime rt = Runtime.getRuntime();
                Process proc = rt.exec("javac");
                //int exitVal = proc.exitValue();
                int exitVal = proc.waitFor();
                System.out.println("Process exitValue: " + exitVal);
            } catch (Throwable t)
                t.printStackTrace();
    }The process can run but never complete.
    Why? Just because when invoke the javac.exe without any argument,it will product a set of usage statements that describe how to run the program and the meaning of all the available program options.So the process is in deadlock.
    The question is, when i change the exec("javac") to exec("javac a.java"), in which the "a.java" is not exist, so the jvm should product error:
    error: cannot read: a.java
    1 error
    But after i changed the code and run the class, at this time the process can run and complete.
    The two codes both product some statements,but why the first one never complete,but the second did. Why?

    import java.util.*;
    import java.io.*;
    public class A
        public static void main(String args[])
            try
                Runtime rt = Runtime.getRuntime();
                Process proc = rt.exec("javac");
                InputStream is = proc.getErrorStream();
                int i=0;
                while ((i = is.read()) != -1)
                    System.out.print((char)i);
                // int exitVal = proc.exitValue();
                // int exitVal = proc.waitFor();
                // System.out.println("Process exitValue: " + exitVal);
            } catch (Throwable t)
                t.printStackTrace();
    }usng this modification, i could see some error messages.
    because exec(cmd) executes the command in a separate process, it will not display the results on the current console. If you want see the results, you should use getInputStream() and getErrorStream().
    good luch ^^

  • Problem with starting a sqlplus-process via java.lang.Process

    Hi,
    I want to start a sqlplus-Process from a java-application via java.lang.Process. Works great with XP. On a W2K-Machine, the process is started (I can see it in the Taskmanager), but it doesn't connect to the db - the OS-process hangs, also the java-application which invoked the process.
    If I start a sqlplusw.exe-Process instead of sqlplus.exe, it works as well.
    Does anybody know what's going wrong ?
    I'm using java 1.5.0_11 and Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
    Thanks in advance
    Jens

    java.lang.Process can be used to perform an OS Shell to launch specific tasks. But why are you interested in specifically launching sqlplus from here?
    ~ Madrid
    http://hrivera99.blogspot.com/

  • Problwm with java.lang.Process

    I am using java.lang.Process to read the output of a command, it works fine with one word commands such as "ls", but a command with a pipe and and arguments returns no output, for example "who | grep root".
    Any ideas!

    for example "who | grep root".
    Any ideas! Probably because you really should have nothing returned. Try to give the output of the first command as an input to the second one but not through a pipe; use java.lang.Process twice.

  • Get complete output from java.lang.Process

    How do I get the complete output from java.lang.Process?
    By the time I've started reading from Process.getInputStream() the process has already terminated...

    I solved the problem:
    private int exec(String pArguments[], OutputStream pOut, OutputStream pErr) throws IOException {
         class ProcessOutputPrinter implements Runnable {
              private InputStream ivIn;
              private OutputStream ivOut;
              public ProcessOutputPrinter(InputStream pIn, OutputStream pOut) {
                   ivIn = pIn;
                   ivOut = pOut;
              public void run() {
                   try {
                        for(int tByte; (tByte = ivIn.read()) != -1; ) {
                             ivOut.write(tByte);
                        ivOut.flush();
                   catch(IOException e) {
                        e.printStackTrace();
         // Start process
         Process tProcess = Runtime.getRuntime().exec(pArguments);
         // Create out printer
         Thread tOutPrinter = new Thread(new ProcessOutputPrinter(tProcess.getInputStream(), pOut), "NamingAdmin out-printer");
         tOutPrinter.start();
         // Create err printer
         Thread tErrPrinter = new Thread(new ProcessOutputPrinter(tProcess.getErrorStream(), pErr), "NamingAdmin err-printer");
         tErrPrinter.start();
         // Wait for process and printers to finish
         try {
              tProcess.waitFor();
              tOutPrinter.join();
              tErrPrinter.join();
         catch(InterruptedException e) {
         // return process exit value
         return tProcess.exitValue();

  • Java.lang.Process output stream problem

    Hi, I have a program that starts a process (java.lang.Process) using the java.lang.Runtime.exec() and it attemtps to interface with it using the provieded io streams. I have both the output and error streams being handled on their own threads and I have a hashmap of output lines/command pairs that are checked so that when the process outputs certain lines to the console it feed the proper input into the process. My problem is that when I feed the input into the process it dosen't respond to it almost like the user hasn't pressed enter, The process hangs. I have tried using /n /r and permutations thereof but nothing works. The thread does read the lines from the process and does output to the process from what i can gather. Can you help me!
    here is some of the code..
    public void run() {
    try {
         //the process's output
         InputStreamReader isrOutput = new InputStreamReader(inOutput);
         //the process's input(our output)
         PrintWriter pw = new PrintWriter(outInput);
         String line = null;
         while(true){
              if(brOutput.ready()){
                   line = "";
                   while(brOutput.ready())
         line+=(char)brOutput.read();
                   System.out.print(line);
                   if(commands.containsKey(line)){
         pw.println((String)commands.get(line));
         System.out.println((String)commands.get(line));;
    } catch (IOException ioe) {
              ioe.printStackTrace();
    }Thanks

    Oops.. i forgot to flush my PrintWriter /blushing......... Thanks

  • JDBC for Postgresql(on Linux): java.lang.NullPointerExceptio--Please HELP!

    I'm trying to build a JSP web application with Apache Tomcat 4.0 on Linux, using PostgreSQL database.
    The test page for building a connection to the database is very simple.
    However, unfortunately, I always get the following error message from the web server.
    The code is also show below.
    I have another Tomcat server working on Window2000 with Oracle. So I change the JDBC driver to Oracle on that machine, and it works fine.
    I guessed I might have some problem with the Tomcat setting, but I'm not sure what I need to change.
    The directory of my web application is built under the webapps.
    And I've added JAVA_HOME, JAVA_HOME/lib/tool.jar, and JDBC for PostgreSQL to my CLASSPATH.
    Is there any other configuration that I missed?
    Please help if you see the problem.
    Thanks a lot in advance.
    Error message:
    type: Exception report
    message: Internal Server Error
    description: The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request.
    exception
    java.lang.NullPointerException
         at org.apache.jsp.index$jsp._jspService(index$jsp.java:231)
         at org.apache.jasper.runtime.HttpJspBase.service(Unknown Source)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
         at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(Unknown Source)
         at org.apache.jasper.servlet.JspServlet.serviceJspFile(Unknown Source)
         at org.apache.jasper.servlet.JspServlet.service(Unknown Source)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
         at org.apache.catalina.core.StandardWrapperValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invoke(Unknown Source)
         at org.apache.catalina.core.ContainerBase.invoke(Unknown Source)
         at org.apache.catalina.core.StandardContextValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invoke(Unknown Source)
         at org.apache.catalina.core.ContainerBase.invoke(Unknown Source)
         at org.apache.catalina.core.StandardContext.invoke(Unknown Source)
         at org.apache.catalina.core.StandardHostValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.valves.ErrorDispatcherValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.valves.ErrorReportValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.valves.AccessLogValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invoke(Unknown Source)
         at org.apache.catalina.core.ContainerBase.invoke(Unknown Source)
         at org.apache.catalina.core.StandardEngineValve.invoke(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invokeNext(Unknown Source)
         at org.apache.catalina.core.StandardPipeline.invoke(Unknown Source)
         at org.apache.catalina.core.ContainerBase.invoke(Unknown Source)
         at org.apache.catalina.connector.http.HttpProcessor.process(Unknown Source)
         at org.apache.catalina.connector.http.HttpProcessor.run(Unknown Source)
         at java.lang.Thread.run(Thread.java:484)
    Here's my code:
    <%@ page language="java" import="java.io.*, java.sql.*, java.util.*, java.lang.*" %>
    <HTML>
    <HEAD>
    <TITLE>TEST</TITLE>
    </HEAD>
    <BODY>
    <b> City </b><br>
    <%
         Class.forName("org.postgresql.Driver");
         String sqlurl = "jdbc:postgresql://localhost:5432/customer";
         String username = "guest";
         String passwd = username;
         Connection conn = DriverManager.getConnection(sqlurl, username, passwd);
         Statement st = conn.createStatement();
         String queryStr = "select CITY from WEATHER";
         ResultSet rs = st.executeQuery(queryStr);
         if (rs != null){
              while(rs.next()){
                   String strCity = rs.getString(1);
    %>
    -- <%=strCity %> --<br>
    <%
         st.close();
         conn.close();
    %>
    </BODY>
    </HTML>

    Error is not there in the code what you are showing. Can you edit index$jsp.java and see what is there in line 231?
    You may find it in tomcat_home\work\your_application directory.
    Sudha

  • Java.lang - process builder

    I want to execute the following command inside my java program
    rep_cmd [file1] -text [file2]
    The above command belongs to an application installed on my PC.
    The above command when executed in the command prompt works fine.
    but it does not work inside my java program
    here is my code:
    public class ProcBuild
    public static void main(String args[]) throws IOException, InterruptedException
    String cmdLine="cmd /c rep_cmd log.wgl -text log1.txt";
    ProcessBuilder pr=new ProcessBuilder(cmdLine);
    pr.start();
    and here is my error message with output:
    run:
    Exception in thread "main" java.io.IOException: Cannot run program "cmd /c "rep_cmd log.wgl" -text "log1.txt"": CreateProcess error=2, The system cannot find the file specified
         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
         at ProcBuild.main(ProcBuild.java:23)
    Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
         at java.lang.ProcessImpl.create(Native Method)
         at java.lang.ProcessImpl.<init>(ProcessImpl.java:188)
         at java.lang.ProcessImpl.start(ProcessImpl.java:132)
         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
         ... 1 more
    Java Result: 1
    BUILD SUCCESSFUL (total time: 0 seconds)
    Edited by: user13286843 on Jan 20, 2012 9:20 AM

    >
    Exception in thread "main" java.io.IOException: Cannot run program "cmd /c "rep_cmd log.wgl" -text "log1.txt"":
    >
    You are passing the entire command as one String and the string is being interpreted as the name of the program and no arguments.
    See the Javadocs for ProcessBuilder. It has an example that shows how to pass the cmd, and each argument as separate Strings.
    Get the Javadoc example working first and then substitute your command and arguments.
    Starting a new process which uses the default working directory and environment is easy:
    Process p = new ProcessBuilder("myCommand", "myArg").start();
    Here is an example that starts a process with a modified working directory and environment:
    ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
    Map<String, String> env = pb.environment();
    env.put("VAR1", "myValue");
    env.remove("OTHERVAR");
    env.put("VAR2", env.get("VAR1") + "suffix");
    pb.directory(new File("myDir"));
    Process p = pb.start();

  • [java.lang.Process] Howto simulate ENTER ?

    Hi there!
    I need to control an interactive command-line tool from java (smbclient) and for this task I use Process with getOutputStream().
    However I want to send commands to the native-program like: Process.getOutputStream.write("exit\n".getBytes()) but it simply does not work :-(
    I think the native programs does not recognize the "\n" as <ENTER> .
    Any ideas howto solve this problem?
    Thanks you in advance, Clemens Eisserer

    Well, thanks for the tips!
    Since I am running Unix '\n' shoulb we enough, but thanks for remembering me g
    Well, I actually forgot to flush the output-Stream. Nobody is perfect ;-)
    Thanks again, lg Clemens

  • About java.lang.Process class?

    hi, i am executing one batch file (it contains 2 executable statements) through java.lang.Runtime class exec method like this..Process p1=r.exec("cmd /K start .\\Skeletons\\reports\\FormatFiles\\"+strDTab+".bat");.. i want to get the output of this process is it success, failure or suspect?. how to use the waitFor() method of Process class in this situation?. and also the execution of the batch program will give some status (if fail it will throw some exception), i want to catch the status. depending on the status i will decide proceed to further statements or not?..

    You use waitFor() by calling it on the process you get back from the exec()
    If you want examples use google to find them.

  • Talk to Java Runtime Process.getOutputStream()

    Hi Experts,
    Good day. I just want to ask I'm actually having this problem. I'm trying to talk to the outputstream and submit a message to telnet but it seems to be that it's not accepting my message.
    private void sendMessage(String message) {
              try {
                   runtime = Runtime.getRuntime();
                   process = runtime.exec("telnet computer_name 9800");
                   System.out.println(process.getOutputStream());
                   PrintWriter pw = new PrintWriter(process.getOutputStream());
                   pw.println(message);
                   BufferedReader in1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
                   BufferedReader in2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                   boolean error = false;
                   String data;
                   StringBuffer inputStream = new StringBuffer();
                   while ((data = in1.readLine()) != null) {
                        error = true;
                        System.out.println(data);
                        inputStream.append(data + "\n");
                   } while ((data = in2.readLine()) != null) {
                        error = true;
                        System.out.println(data);
                        inputStream.append(data);
                        inputStream.append("\n");
                   in1.close();
                   in2.close();
                   pw.flush();
                   pw.close();
              } catch(Exception e) {
                   e.printStackTrace();
    }For the record I have my server running using the correct port number assigned above. If I access the server manually in command prompt, submitting a message is working, however my code does not.
    Edited by: The_Developer on May 9, 2008 8:17 AM

    The_Developer wrote:
    Mine is GUI application and not a command console application, part of it has thread specially reading through the input stream what I have written here is a small version only and I don't need to actually copy the whole code from the site just to understand it :)
    Edited by: The_Developer on May 9, 2008 8:44 AMAlso, there is a further problem then since the OS stdout stream has a 4K (ish) buffer and you will not see any output until the process closes OR until the buffer fills OR the process calls flush().

  • Java.lang.Process  - detecting process termination asynchronously

    Hi All,
    I was wondering if there is anyway to know when a Process (run with Runtime.exec()) has terminated without dedicating a thread per Process and using waitFor().
    The reason I want this is that I have an application running many such processes concurrently, and I wouldn't want to dedicate a thread for each process to detect its termination.
    What I would REALLY like is something like the asynchronous IO 'select' method so that a single thread can block until one of a set of processes terminates.
    Polling would not be as good, but also a viable alternative. However, the only way I could see is calling exitValue() periodically on all Process objects - this would mean getting IllegalThreadStateExceptions thrown galore, as long as the process doesn't terminate. This is both ugly and inefficient (makes the penalty for polling even worse - we generate an exception for each non-terminated process polled...).
    Does anyone have any tips I can use to implement some sort of solution?
    Thanks,
    Ophir.

    >
    What's the requirement for detecting the completed
    processes? I'm not really sure why the Thread per
    process version wasn't acceptable. How many processes
    are there?
    Well... it's an application server, and I'm providing a generic capability. Theoretically, it could be hundreds of processes.
    Also, did you make sure that the Process Object is
    indeed not collectable until the process is complete?I have to say I was pretty skeptical about this myself... ;)
    I have made the test as well as I know: I ran a long running process, and then terminated it with 'kill'.
    I also ran 'sleep 60' to see what happens on normal termination.
    I saw nothing added to the queue while the process was up, and immediate enqueuing after process termination.
    I guess there's no way of making ABSOLUTELY sure this works but if it didn't become collectable 20 consecutive times when up, and became collectable immediately when terminated, that's pretty strong circumstancial evidence...
    Still I just wish there was a neater, tighter solution (though, using your hack, I'm going to get a lot of admiration from some of the people around here - they don't need to know where I got it...).

  • Getting java.lang.IllegalStateException error with response.getOutputStream

    Hi,
    I am writer a JSP site for displaying JFreeChart. The main JSP page gets some parameters then the second page out put the chart as binary data with a Java class.
    I've located the part which generated the error, as follows:
    Code:
    OutputStream os = response.getOutputStream(); <--- this line cause the error
    response.setContentType("image/png");
    ChartUtilities.writeChartAsPNG(os, chart, 400, 300);
    (other than it, the JSP does nothing with response or out)
    Error:
    Servlet.service().for servlet jsp threw exception java.lang.IllegalStateException
    at org.apache.jasper.runtime.ServletResponseWrapperInclude.getOutputStream(ServletResponseWrapperInclude.java:62)
    at org.apache.jsp.build005f005.seriesChart_jsp.jspService(org.apache.jsp.build_005f005.seriesChart_jsp:110)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWarpper.java:325)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
    I've searched this forum and google and seeking for solution for thousands times. But sadly, ways such as adding out.reset(); doesn't work.
    Would any one has some suggestion for me? Your help is very appreciated. Thanks!

    A similar question / answers from jGuru.com
    Question I used getOutputStream() of response object in JSP. Below is the code for download a file in JSP.
    %>
    <%@ page import="java.util.*,
                        java.io.*"
    %>
    <%@ page language="java"
              session="false"
              contentType="text/html; charset=8859_1"
    %>
    <%
         //read the file name.
         File fFile = new File ("D:/Ibs/outdir/batchres.conf");
         String stFileName = "batchres.conf";
         //the content type set as excel
         response.setContentType ("application/excel");
         //the header and also the Nameis set by which user will be prompted to save
         response.setHeader ("Content-Disposition", "attachment;filename=\""+stFileName+"\"");
         //Open an input stream to the file and post the file contents thru the
         //servlet output stream to the client m/c
         InputStream isStream = null;
         ServletOutputStream sosStream = null;
         try
              //response.flushBuffer();
              isStream = new FileInputStream(fFile);
              sosStream = response.getOutputStream();
              int ibit = 256;
              while ((ibit) >= 0)
              ibit = isStream.read();
              sosStream.write(ibit);
         catch (IOException ioeException)
    sosStream.flush();
    sosStream.close();
    isStream.close();
    %>
    If run this code in Tomcat i am getting following error.. �<h1>Error: 500</h1> <h2>Location: /imu/jsp/ibUTLCmnDownloadView.jsp</h2>Internal Servlet Error:
    java.lang.IllegalStateException: getOutputStream() has already been called
         at org.apache.tomcat.facade.HttpServletResponseFacade.getWriter(Unknown Source)
         at org.apache.jasper.runtime.JspWriterImpl.initOut(Unknown Source)
         at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(Unknown Source)
         at jsp.ibUTLCmnDownloadView_12._jspService(ibUTLCmnDownloadView_12.java, Compiled Code)
         at org.apache.jasper.runtime.HttpJspBase.service(Unknown Source)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java)
         at org.apache.tomcat.facade.ServletHandler.doService(Unknown Source)
         at org.apache.tomcat.core.Handler.invoke(Unknown Source)
         at org.apache.tomcat.core.Handler.service(Unknown Source)
         at org.apache.tomcat.facade.ServletHandler.service(Unknown Source)
         at org.apache.tomcat.facade.RequestDispatcherImpl.doForward(Unknown Source)
         at org.apache.tomcat.facade.RequestDispatcherImpl.forward(Unknown Source)
         at JP.co.Hitachi.soft.IBS.Common.Servlet.ibUTLCmnDownloadScrGenServlet.doPost(ibUTLCmnDownloadScrGenServlet.java:75)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java)
         at org.apache.tomcat.facade.ServletHandler.doService(Unknown Source)
         at org.apache.tomcat.core.Handler.invoke(Unknown Source)
         at org.apache.tomcat.core.Handler.service(Unknown Source)
         at org.apache.tomcat.facade.ServletHandler.service(Unknown Source)
         at org.apache.tomcat.core.ContextManager.internalService(Unknown Source)
         at org.apache.tomcat.core.ContextManager.service(Unknown Source)
         at org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Unknown Source)
         at org.apache.tomcat.util.net.TcpWorkerThread.runIt(Unknown Source)
         at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(Unknown Source)
         at java.lang.Thread.run(Thread.java:479)
    Answer
    Don't know if this will help--your code worked as is on my system (J2SDK 1.4.1, Tomcat 4.1.12, Linux)--but you're setting the content-type twice, and to two different values. In the page directive, you specify contentType="text/html; charset=8859_1", and then in the scriptlet, you do a response.setContentType ("application/excel");. Try changing the one in the page directive and deleting the one in the scriptlet. The servlet container may be calling getOutputStream() when it sees the text MIME type so it can prepare the out built-in variable.
    Also, according to the J2EE design patterns, JSP's should only be used to produce text output. Any binary output (such as Excel files) should be produced with servlets--otherwise, the JSP becomes one big scriptlet (like this one).
    If you still want to do this with a JSP, you might want to take out your try ... catch block since you're not doing anything with it. Doing so will allow you to let the servlet container handle the errors (i.e. specify error pages in the web application deployment descriptor). Either that, or at least put the close() and flush()calls in it since they can throw IOExceptions, too. :)
    Finally, you should never close the servlet's output stream. Leave that up to the servlet container.
    Is this item helpful? yes no Previous votes Yes: 2 No: 3
    To transfer file from client to server using jsp programs
    chalpati Rao, Aug 11, 2004 [replies:1]
    How to Download File using JSP program
    Re: To transfer file from client to server using jsp programs
    Saravanan Mani, Aug 24, 2004
    Try restarting the server.It worked for me (ie.you did all the code changes mentioned in the previous reply)
    Breakline problems
    David Machado, Jan 27, 2005 [replies:1]
    Hi! Maybe a problem with breaklines. Try this: ------------------------------------------------------
    %><%@ // don't send breakline here!!!
    page import="java.util.*,
    java.io.*"
    %><%@ // don't send breakline here too!!!
    page language="java"
    session="false"
    contentType="text/html; charset=8859_1"
    %><% // finally, don't send breakline here!!!
    //read the file name.
    File fFile = new File ("D:/Ibs/outdir/batchres.conf");
    String stFileName = "batchres.conf";
    //the content type set as excel
    response.setContentType ("application/excel"); // twice???
    //the header and also the Nameis set by which user will be prompted to save
    response.setHeader ("Content-Disposition", "attachment;filename=\""+stFileName+"\"");
    //Open an input stream to the file and post the file contents thru the
    //servlet output stream to the client m/c
    InputStream isStream = null;
    ServletOutputStream sosStream = null;
    try
    //response.flushBuffer();
    isStream = new FileInputStream(fFile);
    sosStream = response.getOutputStream();
    int ibit = 256;
    while ((ibit) >= 0)
    ibit = isStream.read();
    sosStream.write(ibit);
    catch (IOException ioeException)
    sosStream.flush();
    sosStream.close();
    isStream.close();
    %> // make sure that's no breakline an no spaces at the end!!
    Re: Breakline problems
    Aarthi Sivaram, Apr 19, 2005
    In the above code sosStream = response.getOutputStream(); must be removed. Use 'out' instead of sosStream i.e. out.write(""+ibit); If you look at the Java code generated for your JSP, you can find JspWriter out = null ... .. JspWriter calls response.getOutputStream(), thats why when u call getOutputStream, u get IllegalStateException. 'out' variable is available for direct use in all JSP's, like 'request'. So that can be directly used to write.
    A quick and working workaround
    Leslie Leng, May 20, 2005 [replies:1]
    I am not going to discuss the theory behind, as others gurus mentioned before me, are valid.
    In short, getOutputStream() could not be used more than once, and also it will conflict with JSPWriter's out.
    So, the quick workaround would be, at the end of the JSP page, add the following:
    out.clear();
    out = pageContext.pushBody();
    in example:
    catch(Exception e){
    System.out.print(e);
    out.clear();
    out = pageContext.pushBody();
    %>
    Re: A quick and working workaround
    ajit Pandey, Jul 15, 2005
    Thanks a ton Leslie ,it worked(Production issue) :) credit goes to you....indebted

Maybe you are looking for