Java Forum / First Aid / March 2008
System.out PrintWriter print() and flush() not flushing?
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 MagazinesGet 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 ...
|
|
|