Catching stderr and stdout from a Process

Hey Folks --
So I've wondered how I can spawn a Process (through Runtime.getRuntime().exec()), and actually read its standard output and standard error together. From a process I can get the standard error (getErrorStream) and the standard output (through getInputStream) and read them through a BufferedReader line by line (ie see http://www.devdaily.com/java/edu/pj/pj010016/pj010016.shtml). But this solution only allows you to print out standard output at once, then standard error all at once. In reality, standard error may be interdispersed in the standard output. Any ideas?

1) See When Runtime.exec() won't:
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
I recommed the entire read. Listing 4.7 contains the final version for the StreamGobbler (it will do the job as is but you may want to fiddle with some details). You can instantiate one for each (out and err) and redirect them to the same OutputStream (with the second ctor).
2) You use a ProcessBuilder
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html
and tell it to redirectErrorStream(true)
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html#redirectErrorStream(boolean)

Similar Messages

  • Default Logging of stderr and stdout to files

    Are stderr and stdout logged to a file as part of the default configuration?
    Are stderr and stdout sent to weblogic.log, or to another file?
    Are there parameters in the config.xml for re-directing stderr and stdout to
    a file?
    What should I be looking for?
    Thanks in advance.
    Stan

    Depending on the platform, most people start Weblogic with a shell or batch
    or command script that redirects stderr and stdout ... sometimes to one file
    sometimes to two different files. You can use the ">" and "2>" on
    DOS/Windows/Linux/Unix to redirect stdout and stderr.
    Peace,
    Cameron Purdy
    Tangosol, Inc.
    Clustering Weblogic? You're either using Coherence, or you should be!
    Download a Tangosol Coherence eval today at http://www.tangosol.com/
    "Stan" <[email protected]> wrote in message
    news:[email protected]..
    Are stderr and stdout logged to a file as part of the defaultconfiguration?
    Are stderr and stdout sent to weblogic.log, or to another file?
    Are there parameters in the config.xml for re-directing stderr and stdoutto
    a file?
    What should I be looking for?
    Thanks in advance.
    Stan

  • Capturing stdout from JVM process

    Hi,
    Using JNI native methods I call functions in a shared C library from my Java program. I do not have access to the shared library source code. The shared library writes informational messages to stdout. I want to be able to capture these messages and display them in my Java GUI as they occur. I need a cross-platform solution because the Java program needs to run on both Windows and Linux.
    I have googled and searched the JavaSoft forums but I cannot find an answer to what I am trying to do. I have seen answers on how to do it if you are using Runtime.exec methods, but I am not doing that. Also, redirection on the command line will not work since I want to show these messages as they occur in my GUI.
    I have thought of redirecting stdout to a pipe in the JNI code and using select to read the bytes off the pipe. Then sending the bytes up to a Java object. All this would run in a separate thread. But this seems overly complicated.
    Any suggestions?
    charlie

    I developed a solution to this problem using named pipes. It works well on Linux (2.6 kernel) and it may work on Windows but I don't know. Example code follows. I would be most interested in any feedback on this solution or on the code itself.
    There are 2 files, StdoutRedirect.java and StdoutRedirect.c.
    1) Compile the java file and run javah on it to get StdoutRedirect.h.
    2) Compile the C file into a shared library, here's a makefile:
    StdoutRedirect: StdoutRedirect.o
    gcc -shared -o libStdoutRedirect.so StdoutRedirect.o
    3) Run the java class file.
    charlie
    **** StdoutRedirect.java ****
    import java.io.FileNotFoundException;
    import java.io.IOException;
    * This class, along with its JNI library, demonstrates a method of redirecting stdout of the JVM process to a Java
    * Reader thread. Using this method the stdout bytes can be sent anywhere in the Java program; e.g., displayed in a GUI.
    * This has only been tested on a Linux 2.6 kernel.
    public class StdoutRedirect {
        static {
            System.loadLibrary("StdoutRedirect");
        final static public String NAMED_PIPE = "/tmp/stdoutRedirect";
        native private void setupNamedPipe();
        native private void redirectStdout();
        native public void someRoutine();
        // Flag to indicate to Reader thread when to terminate
        protected boolean keepReading = true;
        public static void main(String[] args) throws IOException {
            StdoutRedirect redir = new StdoutRedirect();
            redir.setupNamedPipe();
            // The first reader or writer to connect to the named pipe will block. So, the reader
            // must be opened first and must be in a new thread. We want it to be in a separate
            // thread anyways so we can receive data asynchronously.
            redir.openReader();
            // At this point, the reader thread is blocked on creating the FileInputStream
            // because it is the first thing to connect to the named pipe. We grab the lock
            // here and redirect stdout to the named pipe. This opens a writer on the named
            // pipe and the reader thread will unblock. We want to wait for the reader thread
            // to unblock and be ready to receive data before continuing.
            synchronized (redir) {
                redir.redirectStdout();
                try {
                    // wait for the reader thread to be ready to receive data
                    redir.wait();
                } catch (InterruptedException e) {
            // write some data to stdout in our C routine
            redir.someRoutine();
            // All done now, so indicate this with our flag
            redir.keepReading = false;
            // The reader thread may be blocked waiting for something to read and not see
            // the flag. So, wake it up.
            System.out.println("Shut down");
            // Make sure everything is out of stdout and then close it.
            System.out.flush();
            System.out.close();
            // stdout is closed. This will not be visible.
            System.out.println("Won't see this.");
         * Starts the reader thread which listens to the named pipe and spits the data
         * it receives out to stderr.
        private void openReader() {
            new Thread() {
                public void run() {
                    try {
                        int BUFF_SIZE = 256;
                        byte[] bytes = new byte[BUFF_SIZE];
                        int numRead = 0;
                        // At this point there is no writer connected to the named pipe so this statement
                        // will block until there is.
                        FileInputStream fis = new FileInputStream(NAMED_PIPE);
                        // The reader thread is ready to accept data. Notify the main thread.
                        synchronized (StdoutRedirect.this) {
                            StdoutRedirect.this.notify();
                        // Keep reading data until EOF or we're told to quit and there is no more data to read
                        while (numRead != -1 && (StdoutRedirect.this.keepReading || fis.available() != 0)) {
                            numRead = fis.read(bytes, 0, BUFF_SIZE);
                            System.err.print("Received - " + new String(bytes, 0, numRead));
                        if (fis != null) {
                            fis.close();
                        System.err.println("Receiver shut down");
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
            }.start();
    } // class StdoutRedirect**** StdoutRedirect.c ****
    #include "StdoutRedirect.h"
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <string.h>
    #include <errno.h>
    // The filesystem location for the named pipe
    const char *namedPipe = "/tmp/stdoutRedirect";
    * Create the named pipe we're going to redirect stdout through. After this
    * method completes, the pipe will exist but nothing will be connected to it.
    JNIEXPORT void JNICALL Java_StdoutRedirect_setupNamedPipe(JNIEnv *env, jobject obj) {
      // make sure there is no pre-existing file in our way
      remove(namedPipe);
      // create the named pipe for reading and writing
      mkfifo(namedPipe, S_IRWXU);
    * Redirect stdout to our named pipe. After this method completes, stdout
    * and the named pipe will be identical.
    JNIEXPORT void JNICALL Java_StdoutRedirect_redirectStdout(JNIEnv *env, jobject obj) {
      // Open the write end of the named pipe
      int  namedPipeFD = open(namedPipe, O_WRONLY);
      printf("Before redirection...\n");
      // make sure there is nothing left in stdout
      fflush(stdout);
      // duplicate stdout onto our named pipe
      if ( dup2(namedPipeFD, fileno(stdout)) == -1 ) {
        fprintf(stderr, "errno %s.\n", strerror(errno));
        fprintf(stderr, "Couldn't dup stdout\n");
      printf("After redirection.\n");
      // flushing is necessary, otherwise output does not stay in sync with Java layer
      fflush(stdout);
    * Do some random writing to stdout.
    JNIEXPORT void JNICALL Java_StdoutRedirect_someRoutine(JNIEnv *env, jobject obj) {
      int i;
      for ( i = 0; i < 3; i++ ) {
        printf("Message %d\n", i);
      printf("End of messages\n");
      // flushing is necessary, otherwise output does not stay in sync with Java layer
      fflush(stdout);
    }

  • Input and output from child process

    Hi all,
    I am developing an IDE for the Haskell functional programming language. The application runs the Haskell interpreter as child process, and sends and receives input from the interpreter. At the moment I'm programming the integrated console through which the IDE should communicate with the interpreter. The problem is that when I send a command to the interpreter to execute the code I can't detect when the code is running and when it waits for input, so I'll be able to dissable and enable input in the the console respectivly. Please answer as soon as possible, and if my explanation of the problem is not clear enough please just comment about it. Thank you in advance.

    Generally the way I have seen that sort of things designed is like this: You have a script in mind. For example:
    1. Send command "ABC DEF" to the interpreter.
    2. Wait until it responds with "OK" or "Failed".
    3. If it responded with "Failed" then quit.
    4. Send command "XYZ XYZ" to the interpreter.
    5. ... and so on
    You can do this in simple or complicated ways, of course. But if you can't do it, then you're going to find it difficult to do anything at all. For example you won't know when the interpreter is waiting for input (that seems to be your problem already).

  • Rolling weblogic.stderr and weblogic.stdout log files

    Is there a way of make the -Dweblogic.stderr and -Dweblogic.stdout log files, rotate by size or time? We are running into 100MB+ files because we can't find any documentation about how to rotate these files.
    Thanks,
    Rajesh

    The stdout and stderr output options in weblogic apply to the jvm process using the standard unix standard in/ standard out redirection; therefore, BEA has not included a native method to rotate these files.
    However, in weblogic 10, if you place these files in the same directory as the weblogic output log (not to be confused with -D=/path/to/stderr.log and -D=/path/to/stdout.log they will be rotated every time you restart the server.
    The other way to get fine-grained log rotation on these files is to use a standard log rotation mechanism such as logrotate: http://linuxcommand.org/man_pages/logrotate8.html
    The other option is to address logging using an application framework such as log4j from a development standpoint.
    As of right now, these are your only options, unless someone puts in a feature request to BEA.

  • [svn] 869: Bug: BLZ-92 - catch IOException and log at the info level to keep from polluting the logs

    Revision: 869
    Author: [email protected]
    Date: 2008-03-19 15:21:25 -0700 (Wed, 19 Mar 2008)
    Log Message:
    Bug: BLZ-92 - catch IOException and log at the info level to keep from polluting the logs
    QA: Yes
    Doc: No
    Details:
    Tomcat 5+ throws a ClientAbortException when it receives a TCP RST while writing a response to a client that has exited. This custom exception extends IOException, and we were only doing lighter INFO-level logging for SocketExceptions so the ClientAbortException was getting past this leading to ERROR level logging. This little tweak will mean less pollution of the server logs during QE load tests.
    Ticket Links:
    http://bugs.adobe.com/jira/browse/BLZ-92
    Modified Paths:
    blazeds/branches/3.0.x/modules/core/src/java/flex/messaging/endpoints/BaseHTTPEndpoint.ja va

    Hi AbhijitRoy2005,
    Other then climbing in the phone and calling the vendor, you could try:
    1. To use a BufferedInputStream to wrap the SocketInputStream before you wrap that in the DataInputStream. So basically:
    DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream());On one of my implementations this made a difference of a factor of 200+! So instead of processing 500 messages per second, I could process 10000 messages per second!
    2. Or to take it to the next level and take a look at using NIO. That is New IO, available since Merlin (Java 1.4). But that would take you way more time then the first attempt.
    The thing addressed by the possible solutions above is the blocking nature of the Stream based socket handling. Using a buffered input stream reads ahead. The NIO thing is all about non-blocking IO, which uses Channels and Buffers instead of Sockets and Streams (note that these are not equivalent!).
    Of course, if you didn't change something in your own code, it might just very well be that the vendor just screwed up his ;)
    Regards,
    Frens

  • Call executable and stdout/stderr

    Is there a possibility to save  the output of commandline program which writes to stdout/stderr and which is run from a call executable teststep other than to redirect the stdout/stderr channels to a file ?

    The Call Executable Step Type does is not able to access the stdout/stdin/stderr at the present time.  This may be a feature we consider adding for a future version of TestStand.
    One workaround you can do is to call an executable from another environment (such as LabVIEW), and create a custom step type from this.
    Allen P.
    NI

  • How to catch the error occurred in Integration Process, and then save it?

    1. how to catch the error occurred in Integration Process, and then save the detailed error message to the file?
    2. there are fault message type for inbound message interface, how to use the fault message type in IR?
    Thanks,
    Michael
    Message was edited by: Spring Tang
    inital
    Message was edited by: Spring Tang
    detailed message output
    Message was edited by: Spring Tang
    fault message type

    Hi Spring,
    If u give an exception step along with your Transformation Step, whenever some error occurs in your message mapping, this exception block wil be triggered.
    You can configure your exception block to do all exception processing that you want. This exception handling is like any other java Exceptio n Handler. You can do anything that you want in your exception handler block on the basis of your requirements.
    <i>If an exception is triggered at runtime, the system first searches for the relevant exception handler in surrounding blocks. If it does not find the correct exception handler, it continues the search in the next block in the block hierarchy.
    When the system finds the correct system handler, it stops all active steps in the block in which the exception handler is defined and then continues processing in the exception handler branch. Once the exception handler has finished processing, the process is continued after the block.
    If the system fails to find an exception handler, it terminates the integration process with an error.</i>
    Regards,
    Bhavesh

  • Calling stored procedure from page process and PLS-00049 error?

    Good morning guys!
    I'm dealing with several problems this morning! The one that I need to deal with first is the following.
    I created the page process (see below: 1st code) in order to validate if all records where LNG_GEBIET matches have the status 3 or 4. If that is the case I want to call the procedure "set_status_arbeit_zu_gebiet". If amountrs and countstat do not match, then nothing is supposed to be done.
    The problem lies within the stored procedure itself. I receive a PLS-00049 bind variable error for :new.LNG_GEBIET.
    Can you please tell me what I forgot to declare in code 2 below???
    Thank you guys!
    The page process:
    Declare
      amountrs    number;
      countstat   number;
    begin
    SELECT COUNT(*) INTO amountrs FROM TBL_PUNKTDATEN where LNG_GEBIET = :P4_CNT_GEBIET;
    SELECT COUNT(*) INTO countstat FROM TBL_PUNKTDATEN where LNG_GEBIET = :P4_CNT_GEBIET and INT_STATUS = 3 or LNG_GEBIET = :P4_CNT_GEBIET and INT_STATUS = 4;
        IF amountrs = countstat THEN
         set_status_arbeit_zu_gebiet;
        ELSE
         dbms_output.put('nothing');
        END IF ;
    end;Code 2 with the true problem!
    CREATE OR REPLACE PROCEDURE set_status_arbeit_zu_gebiet
    IS
        cursor c2 is select LNG_GEBIET from TBL_ARBEIT_ZU_GEBIET where PNUM = 1114 and LNG_GEBIET=:new.LNG_GEBIET;
        v_c2  c2%ROWTYPE;
    BEGIN
       open c2;
    fetch c2 into v_c2;
    if c2%notfound then
            INSERT INTO TBL_ARBEIT_ZU_GEBIET
            LNG_GEBIET,
              LNG_ARBEITSSCHRITT,
              PNUM,
              INT_BEARBEITER,
              DATE_DATUM,
              GEPL_DATUM
            VALUES
            (:new.LNG_GEBIET,
             52,
             1114,
             895,
             sysdate,
             to_date('01.01.1990', 'DD.MM.YYYY')
            commit;
            close c2;
    END set_status_arbeit_zu_gebiet;One more question: Is it possible to integrate the first validation that calls my stored procedure into code 2?
    Thanks for you time!
    Sebastian

    The error is in following statement:
    INSERT INTO TBL_ARBEIT_ZU_GEBIET ( ... ) VALUES ( :new.LNG_GEBIET, ... );
    As the statement is part of a procedure and not trigger so it is not able to bind this variable with any value.
    As a resolution, pass this value to the procedure from the process and use it in the insert statement.
    The process will have following IF statement:_
    IF amountrs = countstat THEN
    set_status_arbeit_zu_gebiet *(:P4_CNT_GEBIET)*;
    ELSE
    dbms_output.put('nothing');
    END IF ;
    and the procedure will be as follows:_
    CREATE OR REPLACE PROCEDURE set_status_arbeit_zu_gebiet *(p_lng_gebit varchar2)*
    IS
    cursor c2 is select LNG_GEBIET from TBL_ARBEIT_ZU_GEBIET where PNUM = 1114 and LNG_GEBIET= --:new.LNG_GEBIET-- p_lng_gebit ;
    v_c2 c2%ROWTYPE;
    BEGIN
    INSERT INTO TBL_ARBEIT_ZU_GEBIET ( ... )
    VALUES
    ( --:new.LNG_GEBIET--  p_lng_gebit, ... );
    END set_status_arbeit_zu_gebiet;

  • Delete request in ODS and Cube from process chain

    Hi Experts,
    I have the next situation:  I have a process that each month need to extract data with a selection criteria of fiscalperiod and fiscalyear, only I can maintain a data request with this selection. For this, I need a delete the old request when I am extracting new data with the same selection criteria, in ODS and Cube.
    Is it possible?
    Thank you very much for your collaboration.
    Regards,
    Jeysi

    Hi Jeysi,
    DSO works on 'Overwrite' principle.
    You need to check your data source.(The images your data source sends).
    Even if your updating the key figures using addition method, the data source will send you the correct images and correct delta to keep your DSO as a reflection of the latest image of your source system.
    Hence you would not require to delete a request with the same selection in the DSO.
    Moreover, if you have a cube at the downstream of the DSO, loading deltas from the DSO to cube would alone be sufficient and you would not need to use delete overlapping request.
    However, if you are loading full request to the cube from the data source with the selections of fiscal year and fiscal period , then yes you do require delete overlapping selections.
    In 3.x data flow, this was configured in infopackage in data target tab there is one column for automatic deletions, here you could set the conditions on which the overlapping request in the data target(cube) in this case should be deleted.
    In process chain, you can use , delete overlapping request from the process chain.under application node, load process and post processing.(This can be configured for both infopackages and DTP's)
    Hope this helps,
    Regards,
    Sunmit.

  • I am using the window xp and firefox 6. I see many videos on youtube. How I get that videos from the catch folder and where is it?

    I am using the window xp and firefox 6.
    I watch the youtube videos online.
    How I get that video from the catch folder and where that catch folder are situated in the window xp.

    ''How can I view or retrieve a video from Firefox's cache''
    To actually view/retrieve the file from the cache and its web address you can use
    the "Cache Viewer" extension 32.8KB
    * https://addons.mozilla.org/firefox/addon/cacheviewer/
    * http://dmcritchie.mvps.org/firefox/firefox.htm#cacheviewer
    For you to be able to view the cached file you would have had to have watched the entire file.
    The latest version of the extension is 0.7b available in all versions you would have to override compatibility by any of these methods
    * checking or pick up one of the xpi versions in the reader comments for Firefox 6.0
    * extensions.checkCompatibility.6.0 set to False
    *: http://kb.mozillazine.org/Extensions.checkCompatibility
    * or with an extension "Add-on Compatibility Reporter" (84.0 KB) seems preferred in this group
    *:https://addons.mozilla.org/en-US/firefox/addon/add-on-compatibility-reporter/
    There are also extensions such as Video downloader 132.8 KB
    * Download YouTube Videos + Flash Video Downloader / Download-Helper
    *:https://addons.mozilla.org/firefox/addon/download-youtube-videos/
    <br><small>Please mark "Solved" one answer that will best help others with a similar problem after you've tried several things.</small>

  • I ordered my iPhone 6 plus 128GB space gray on 9/26/14 and the status still hasn't changed from in process

    I ordered my iPhone 6 plus 128GB space grey on 9/26/14 and my status hasn't changed from in process yet.

        Awesome, DeckNobets! Waiting is never easy! As
    h00t mentioned, you'll be able to see a change from Processing once the phone officially ships, then you'll see the tracking number. Since you've received a confirmation email that your order was submitted, any additional information throughout the fulfillment process will be sent to that same email address. Congrats on your new iPhone Plus!
    TanishaS1_VZW
    Follow us on  Twitter@VZWSupport

  • HT201210 tried to do an over the air update from ios 7.0 to ios 7.0.2, my phone is in a Recovery Mode loop, I am unable to restore via ITUNES, in ITUNES I try to click RESTORE, it downloads 1 item and then tries to process and loops......how do I correct

    tried to apply the IOS 7.0.2 update to my Iphone 4 running IOS 7 last night, the process failed and the device is in some type of Recovery Mode, when I try to restore using latest version of itunes it appears to download 1 item, then posts a message of 'iphone software update (processing file)' but does not ever appear to complete, please tell me how I can get this corrected, thank you!

    a quick update, I turned off all security software on my windows desktop and tried this 'Restore' process via iTunes again and it appears to be processing....what an unbelievable PITA

  • How do I improve performance while doing pull, push and delete from Azure Storage Queue

           
    Hi,
    I am working on a distributed application with Azure Storage Queue for message queuing. queue will be used by multiple clients across the clock and thus it is expected that it would be heavily loaded most on the time in usage. business case is typical as in
    it pulls message from queue, process the message then deletes the message from queue. this module also sends back a notification to user indicating process is complete. functions/modules work fine as in they meet the logical requirement. pretty typical queue
    scenario.
    Now, coming to the problem statement. since it is envisaged that the queue would be heavily loaded most of the time, I am pushing towards to speed up processing of the overall message lifetime. the faster I can clear messages, the better overall experience
    it would be for everyone, system and users.
    To improve on performance I did multiple cycles for performance profiling and then improving on the identified "HOT" path/function.
    It all came down to a point where only the Azure Queue pull and delete are the only two most time consuming calls outside. I can further improve on pull, which i did by batch pulling 32 message at a time (which is the max message count i can pull from Azure
    queue at once at the time of writing this question.), this returned me a favor as in by reducing processing time to a big margin. all good till this as well.
    i am processing these messages in parallel so as to improve on overall performance.
    pseudo code:
    //AzureQueue Class is encapsulating calls to Azure Storage Queue.
    //assume nothing fancy inside, vanila calls to queue for pull/push/delete
    var batchMessages = AzureQueue.Pull(32); Parallel.ForEach(batchMessages, bMessage =>
    //DoSomething does some background processing;
    try{DoSomething(bMessage);}
    catch()
    //Log exception
    AzureQueue.Delete(bMessage);
    With this change now, profiling results show that up-to 90% of time is only taken by the Azure Message delete calls. As it is good to delete message as soon as processing is done, i remove it just after "DoSomething" is finished.
    what i need now is suggestions on how to further improve performance of this function when 90% of the time is being eaten up by the Azure Queue Delete call itself? is there a better faster way to perform delete/bulk delete etc?
    with the implementation mentioned here, i get speed of close to 25 messages/sec. Right now Azure queue delete calls are choking application performance. so is there any hope to push it further.
    Does it also makes difference in performance which queue delete call am making? as of now queue has overloaded method for deleting message, one which except message object and another which accepts message identifier and pop receipt. i am using the later
    one here with message identifier nad pop receipt to delete message from queue.
    Let me know if you need any additional information or any clarification in question.
    Inputs/suggestions are welcome.
    Many thanks.

    The first thing that came to mind was to use a parallel delete at the same time you run the work in DoSomething.  If DoSomething fails, add the message back into the queue.  This won't work for every application, and work that was in the queue
    near the head could be pushed back to the tail, so you'd have to think about how that may effect your workload.
    Or, make a threadpool queued delete after the work was successful.  Fire and forget.  However, if you're loading the processing at 25/sec, and 90% of time sits on the delete, you'd quickly accumulate delete calls for the threadpool until you'd
    never catch up.  At 70-80% duty cycle this may work, but the closer you get to always being busy could make this dangerous.
    I wonder if calling the delete REST API yourself may offer any improvements.  If you find the delete sets up a TCP connection each time, this may be all you need.  Try to keep the connection open, or see if the REST API can delete more at a time
    than the SDK API can.
    Or, if you have the funds, just have more VM instances doing the work in parallel, so the first machine handles 25/sec, the second at 25/sec also - and you just live with the slow delete.  If that's still not good enough, add more instances.
    Darin R.

  • How is it posible to get the File name, size and type from a File out the H

    How is it posible to get the File name, size and type from a File out the HttpServletRequest. I want to upload a File from a client and save it on a server with the client name. I want to conrole before saving the name, type and size of the file.How is it posible to get the File name, size and type from a File out the HttpServletRequest.
    form JSP
    <form name="form" method="post" action="procesuploading.jsp" ENCTYPE="multipart/form-data">
    File: <input type="file" name="filename"/
    Path: <input type="text" readonly="" name="path" value="c:"/
    Saveas: <input type="text" name="saveas"/>
    <input name="submit" type="submit" value="Upload" />
    </form>
    proces JSP
    <%@ page language="java" %>
    <%@ page import="java.util.*" %>
    <%@ page import="FileUploadBean" %>
    <jsp:useBean id="TheBean" scope="page" class="FileUploadBean" />
    <%
    TheBean.doUpload(request);
    %>
    BEAN
    import java.io.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletInputStream;
    public class FileUploadBean {
    public void doUpload(HttpServletRequest request) throws IOException
              String melding = "";
              String filename = request.getParameter("saveas");
              String path = request.getParameter("path");
              PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test.java")));
              ServletInputStream in = request.getInputStream();
              int i = in.read();
              System.out.println("filename:"+filename);
              System.out.println("path:"+path);
              while (i != -1)
                   pw.print((char) i);
                   i = in.read();
              pw.close();
    }

    Thanks it works great.
    Here an excample from my code
    import org.apache.commons.fileupload.*;
    public class FileUploadBean extends Object implements java.io.Serializable{
    String foutmelding = "geen";
    String path;
    String filename;
    public boolean doUpload(HttpServletRequest request) throws IOException
         try
         // Create a new file upload handler
         FileUpload upload = new FileUpload();
         // Set upload parameters
         upload.setSizeMax(100000);
         upload.setSizeThreshold(100000000);
         upload.setRepositoryPath("/");
         // Parse the request
         List items = upload.parseRequest(request);
         // Process the uploaded fields
         Iterator iter = items.iterator();
         while (iter.hasNext())
         FileItem item = (FileItem) iter.next();
              if (item.isFormField())
                   String stringitem = item.getString();
         else
              String filename = "";
                   int temp = item.getName().lastIndexOf("\\");
                   filename = item.getName().substring(temp,item.getName().length());
                   File bestand = new File(path+filename);
                   if(item.getSize() > SizeMax && SizeMax != -1){foutmelding = "bestand is te groot.";return false;}
                   if(bestand.exists()){foutmelding ="bestand bestaat al";return false;}
                   FileOutputStream fOut = new FileOutputStream(bestand);     
                   BufferedOutputStream bOut = new BufferedOutputStream(fOut);
                   int bytesRead =0;
                   byte[] data = item.get();
                   bOut.write(data, 0 , data.length);     
                   bOut.close();
         catch(Exception e)
              System.out.println("er is een foutontstaan bij het opslaan de een bestand "+e);
              foutmelding = "Bestand opsturen is fout gegaan";
         return true;
         }

Maybe you are looking for

  • Historical and transaction data in the same tables creates perf problems

    Our Oracle based application is slow partly due to the fact that historical data are kept in the same table as transactional data. For example records about deceased patients, patients treated 5 years ago...etc, are kept in the one and only one patie

  • Oracle BPM 10.3.1 on Websphere 6.1.01.19

    We configured the BPM 10.3.1 as per the documentation and deployed the sample application. All the applications came up. After logging into workspace, we got the following error. The Process '/SampleProcess#Default-1.0' is not available. The Process

  • Anyone got an idea, mainly mods please.

    Hi, I have another speed issue, again!. These are my results and there done ethernet to my HH4 with no other devices running. I get the same results every time, its as if again BT are putting a fix on my line, I have tried to reset my HH4 but I get t

  • How to treat packaging material at GR / no track

    Guru , i have done GR for a material with a packaging material which consistutes a handling unit . ie handling unit= materaial + packaging material . when i did GRN , maetrial is shown in the storage location . fine . where is the packaging material

  • Set DNS to automatic across multiple NIC's

    I have a client with 100(ish) computers. Whoever their IT firm was before us has manually set DNS on most of these computers. I would like to set all NICs on all computers to dynamic, and pull the DNS server address from DHCP server. The problem is I