Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / First Aid / March 2008

Tip: Looking for answers? Try searching our database.

System.out PrintWriter print() and flush() not flushing?

Thread view: 
Karsten Wutzke - 29 Feb 2008 04:26 GMT
Hello!

I have a thread that listens to a server socket. When a message
arrives, I print it via

System.out.println("...");

While the program is listening and not receiving a message I simply
want to print one dot "." so the user can see the program is still
listening. However, the dots are not printed, they only appear after
another call to println(). I also call flush() after print but it
doesn't flush the buffer.

Does anyone know how to print only a dot without a newline? How?

Karsten
Knute Johnson - 29 Feb 2008 04:54 GMT
> Hello!
>
[quoted text clipped - 12 lines]
>
> Karsten

Are you trying to read from the console too?  If that is the case I
think you will be unsuccessful.

From the docs for PrintWriter

"Unlike the PrintStream class, if automatic flushing is enabled it will
be done only when one of the println, printf, or format methods is
invoked, rather than whenever a newline character happens to be output.
These methods use the platform's own notion of line separator rather
than the newline character."

This could be part of the problem too.  Maybe it would be better to use
PrintStream rather than PrintWriter.

Signature

Knute Johnson
email s/nospam/knute/

Karsten Wutzke - 29 Feb 2008 05:12 GMT
On 29 Feb., 05:54, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> > Hello!
>
[quoted text clipped - 36 lines]
>       ------->>>>>>http://www.NewsDemon.com<<<<<<------
> Unlimited Access, Anonymous Accounts, Uncensored Broadband Access

Oops... I meant PrintStream from the beginning of my posting. So the
subject should read:

"System.out PrintStream print() and flush() not flushing?"

How do I go? Using

System.out.print(".");
System.out.flush();

Does not show the dot immediately as I'd like...

Karsten
Knute Johnson - 29 Feb 2008 05:23 GMT
> On 29 Feb., 05:54, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> wrote:
[quoted text clipped - 46 lines]
>
> Karsten

I tried a simple program to do that and pause for a second and it works
fine on my XP computer.  What OS are you using?  Are you trying to do
input from the console too?

Signature

Knute Johnson
email s/nospam/knute/

Karsten Wutzke - 29 Feb 2008 08:03 GMT
On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> > On 29 Feb., 05:54, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> > wrote:
[quoted text clipped - 60 lines]
>       ------->>>>>>http://www.NewsDemon.com<<<<<<------
> Unlimited Access, Anonymous Accounts, Uncensored Broadband Access

Could you post your simple program please?

I'm not getting any input from the console at any time. The software
is GUI driven.

It's strange.

Hmmm here's the code I use:

while ( sck.isConnected() )
{
   //flag raised when server delivers a null
   boolean wasNullBefore = false;

   try
   {
       String strMessage = br.readLine();

       if ( strMessage != null )
       {
           if ( wasNullBefore )
           {
               //last message was null, so a dot was printed,
               //make newline so non-null message is printed in a new
line
               System.out.println();
           }

           //message factory
           Message msg = mf.createIncomingMessage(strMessage);

           processIncomingMessage(msg);

           //lower flag
           wasNullBefore = false;
       }
       else
       {
           //if server delivers null print a dot (so not so many
lines get wasted)
           System.out.print(".");
           System.out.flush();

           //raise flag
           wasNullBefore = true;
       }

       Thread.sleep(250);
   }
   catch ( Exception e )
   {
       e.printStackTrace();
   }
}

Well I simply want to print dots on null messages so I don't waste a
whole line every 4th of a second... that's about it. But flush doesn't
flush. *shrug*

Karsten
Knute Johnson - 29 Feb 2008 17:32 GMT
> On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> wrote:
[quoted text clipped - 110 lines]
>
> Karsten

Karsten:

I see your problem, BufferedReader.readLine() is not going to return a
null until the end of stream. Which if you are reading from a stream
attached to a socket won't be until the socket is closed.

You could set a timeout on the socket to a few seconds and write the .
when the exception is caught.  See pseudo code below

try {
    socket.setSoTimeout(5000);
    String str = null;
    do {
        try {
            str = br.readLine();
        } catch (SocketTimeoutException ste) {
            System.out.print(".");
        }
    } while (str != null) ;
} catch (IOException ioe) {
    //
}

Read the docs for Socket.setSoTimeout() for details.

Signature

Knute Johnson
email s/nospam/knute/

Karsten Wutzke - 05 Mar 2008 07:30 GMT
On 29 Feb., 18:32, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> > On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> > wrote:
[quoted text clipped - 136 lines]
>
> Read the docs for Socket.setSoTimeout() for details.

I tried your solution, but there's still no flush on printing just a
dot without println...

while ( sck.isConnected() && !sck.isClosed() )
{
   boolean doNewline = false;

   try
   {
       //times out according to socket (here one sec)
       String strMessage = br.readLine();

       if ( strMessage != null )
       {
               if ( doNewline )
               {
                   System.out.println();
               }

               System.out.println(" IN  <<< '" + strMessage + "'");

               Message msg = mf.createIncomingMessage(strMessage);

               processIncomingMessage(msg);

               doNewline = false;
           }

           Thread.sleep(msec);

       }
       catch ( SocketTimeoutException ste )
       {
           //doesn't flush
           System.out.print(".");
           System.out.flush();
           doNewline = true;
       }
       catch ( Exception e )
       {
           e.printStackTrace();
       }
   }
}

When I let the program run for a few seconds nothing gets printed
while receiving no data (timeout), when I close the program and return
to the shell, all missing dots are printed all at once. But this is
not what I wanted. I want to print just a dot without newline for each
second the socket doesn't receive data.

Im out of ideas *shrug*... sometimes the easiest things to do turn out
to be the most pain in the...

Karsten
Knute Johnson - 06 Mar 2008 18:50 GMT
> I tried your solution, but there's still no flush on printing just a
> dot without println...
[quoted text clipped - 51 lines]
>
> Karsten

What do you think flush() is supposed to do?  Printing the 'dot' is all
that System.out.print(".") and System.out.flush() is going to do.

Signature

Knute Johnson
email s/nospam/linux/

     ------->>>>>>http://www.NewsDem

Roger Lindsjö - 08 Mar 2008 19:28 GMT
> On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> wrote:
[quoted text clipped - 51 lines]
>
> Could you post your simple program please?

Something like this? On my system flush is not needed.

<sscce>
public class FlushTest {
  public static void main(String[] args) throws Exception {
    for (int i = 0; i < 100; i ++) {
      System.out.print('.');
      Thread.sleep(100);
    }
  }
}
</sscce>

Signature

Roger Lindsjö

Gordon Beaton - 29 Feb 2008 06:44 GMT
> How do I go? Using
>
> System.out.print(".");
> System.out.flush();
>
> Does not show the dot immediately as I'd like...

Are you running the program in an ordinary text console, or using
something like Netbeans?

/gordon

--
Karsten Wutzke - 29 Feb 2008 07:52 GMT
> > How do I go? Using
>
[quoted text clipped - 9 lines]
>
> --

I'm using Cygwin, nothing that special I suppose.

Karsten
Roedy Green - 05 Mar 2008 08:13 GMT
>Does anyone know how to print only a dot without a newline? How?

just use the print() and flush() or autoflush on the open.

See http://mindprod.com/applet/fileio.html
for details.
--

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com
Karsten Wutzke - 05 Mar 2008 13:35 GMT
On 5 Mrz., 09:13, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:

> >Does anyone know how to print only a dot without a newline? How?
>
[quoted text clipped - 6 lines]
> Roedy Green Canadian Mind Products
> The Java Glossaryhttp://mindprod.com

Huh? I didn't get that.

I do use print and flush... see

catch ( SocketTimeoutException ste )
{
   //doesn't flush
   System.out.print(".");
   System.out.flush();
   doNewline = true;
}

What did you mean with "open"?

Karsten
Karsten Wutzke - 05 Mar 2008 13:42 GMT
On 5 Mrz., 09:13, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:

> >Does anyone know how to print only a dot without a newline? How?
>
[quoted text clipped - 6 lines]
> Roedy Green Canadian Mind Products
> The Java Glossaryhttp://mindprod.com

Just recognized I completely messed up code formatting:
while ( sck.isConnected() && !sck.isClosed() )
{
   boolean doNewline = false;

   try
   {
       //times out according to socket (here one sec)
       String strMessage = br.readLine();

       if ( strMessage != null )
       {
           if ( doNewline )
           {
               System.out.println();
           }

           System.out.println(" IN  <<< '" + strMessage + "'");

           Message msg = mf.createIncomingMessage(strMessage);

           processIncomingMessage(msg);

           doNewline = false;
       }

       Thread.sleep(msec);

   }
   catch ( SocketTimeoutException ste )
   {
       //doesn't flush
       System.out.print(".");
       System.out.flush();
       doNewline = true;
   }
   catch ( Exception e )
   {
       e.printStackTrace();
   }
}

Again, this lets the loop check the input stream every X msec, if the
string is non null, print what came in, otherwise br.readLine will
block, because of the timeout of Y msec a SocketTimeoutException is
thrown, print a simple dot to the console.

As I said, nothing gets printed until another newline or program end.

Karsten
Thomas Schodt - 05 Mar 2008 16:08 GMT
> Just recognized I completely messed up code formatting:
> while ( sck.isConnected() && !sck.isClosed() )

Just to let you know;

bool Socket.isConnected()
what the javadoc should say:
Indiates if connect() has been called on this socket.
Initially this method returns false. After a connection is established,
this method method returns true. It will never change back to false for
any reason (like the connection failing).

bool Socket.isClosed()
what the javadoc should say:
Indicates if close() has been called on this socket.
Initially this method returns false. After Socket.close() is invoked
this method returns true. It will not return true for any other reason
(like the connection being closed by the remote end).

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4672570
Roedy Green - 06 Mar 2008 02:41 GMT
>catch ( SocketTimeoutException ste )
>    {
[quoted text clipped - 3 lines]
>        doNewline = true;
>    }

That should work.

what evidence do you have this code is ever executed?
what happens with System.err.println("timed out");
--

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com
Karsten Wutzke - 10 Mar 2008 21:03 GMT
On 6 Mrz., 03:41, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:

> >catch ( SocketTimeoutException ste )
> >    {
[quoted text clipped - 12 lines]
> Roedy Green Canadian Mind Products
> The Java Glossaryhttp://mindprod.com

Because when using println instead print the line *does* get printed.
Additionally the System.out.print() dots get printed only when I leave
the application... It's really strange, I have no idea why it seems to
happen only to me.

I've just extracted the core of my code into a GUI-less test program,
when run it works *as intended*. Absoletely no clue what could cause
the differing behavior...

Karsten
Knute Johnson - 10 Mar 2008 22:30 GMT
> On 6 Mrz., 03:41, Roedy Green <see_webs...@mindprod.com.invalid>
> wrote:
[quoted text clipped - 25 lines]
>
> Karsten

If you really want an answer to this you need to post a SSCCE that we
can try to duplicate the problem with.

Signature

Knute Johnson
email s/nospam/linux/

Patricia Shanahan - 10 Mar 2008 22:40 GMT
...
> I've just extracted the core of my code into a GUI-less test program,
> when run it works *as intended*. Absoletely no clue what could cause
> the differing behavior...
...

Often, conversion between a GUI and GUI-less program changes the
threading structure.

Patricia
Knute Johnson - 11 Mar 2008 05:20 GMT
> ...
>> I've just extracted the core of my code into a GUI-less test program,
[quoted text clipped - 6 lines]
>
> Patricia

I'm pretty sure that his problem is in the code we are not seeing.

Signature

Knute Johnson
email s/nospam/linux/



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.