Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

1,539 views
Skip to first unread message

Karsten Wutzke

unread,
Feb 28, 2008, 11:26:51 PM2/28/08
to
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

unread,
Feb 28, 2008, 11:54:37 PM2/28/08
to

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.

--

Knute Johnson
email s/nospam/knute/

--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDemon.com<<<<<<------
Unlimited Access, Anonymous Accounts, Uncensored Broadband Access

Karsten Wutzke

unread,
Feb 29, 2008, 12:12:35 AM2/29/08
to
On 29 Feb., 05:54, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:

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

unread,
Feb 29, 2008, 12:23:08 AM2/29/08
to

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?

Gordon Beaton

unread,
Feb 29, 2008, 1:44:37 AM2/29/08
to
On Thu, 28 Feb 2008 21:12:35 -0800 (PST), Karsten Wutzke wrote:
> 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

unread,
Feb 29, 2008, 2:52:57 AM2/29/08
to

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

Karsten

Karsten Wutzke

unread,
Feb 29, 2008, 3:03:39 AM2/29/08
to
On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>

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

unread,
Feb 29, 2008, 12:32:42 PM2/29/08
to

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.

Karsten Wutzke

unread,
Mar 5, 2008, 2:30:39 AM3/5/08
to
On 29 Feb., 18:32, Knute Johnson <nos...@rabbitbrush.frazmtn.com>

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

Roedy Green

unread,
Mar 5, 2008, 3:13:14 AM3/5/08
to
On Thu, 28 Feb 2008 20:26:51 -0800 (PST), Karsten Wutzke
<kwu...@web.de> wrote, quoted or indirectly quoted someone who said :

>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

unread,
Mar 5, 2008, 8:35:55 AM3/5/08
to
On 5 Mrz., 09:13, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:

> On Thu, 28 Feb 2008 20:26:51 -0800 (PST), Karsten Wutzke
> <kwut...@web.de> wrote, quoted or indirectly quoted someone who said :

>
> >Does anyone know how to print only a dot without a newline? How?
>
> just use the print() and flush() or autoflush on the open.
>
> Seehttp://mindprod.com/applet/fileio.html

> for details.
> --
>
> 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

unread,
Mar 5, 2008, 8:42:10 AM3/5/08
to
On 5 Mrz., 09:13, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:
> On Thu, 28 Feb 2008 20:26:51 -0800 (PST), Karsten Wutzke
> <kwut...@web.de> wrote, quoted or indirectly quoted someone who said :

>
> >Does anyone know how to print only a dot without a newline? How?
>
> just use the print() and flush() or autoflush on the open.
>
> Seehttp://mindprod.com/applet/fileio.html

> for details.
> --
>
> 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

unread,
Mar 5, 2008, 11:08:10 AM3/5/08
to
Karsten Wutzke wrote:
>
> 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

unread,
Mar 5, 2008, 9:41:16 PM3/5/08
to
On Wed, 5 Mar 2008 05:42:10 -0800 (PST), Karsten Wutzke
<kwu...@web.de> wrote, quoted or indirectly quoted someone who said :

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

That should work.

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

Knute Johnson

unread,
Mar 6, 2008, 1:50:58 PM3/6/08
to

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.

--

Knute Johnson
email s/nospam/linux/

Roger Lindsjö

unread,
Mar 8, 2008, 2:28:59 PM3/8/08
to

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>

--
Roger Lindsjö

Karsten Wutzke

unread,
Mar 10, 2008, 4:03:55 PM3/10/08
to
On 6 Mrz., 03:41, Roedy Green <see_webs...@mindprod.com.invalid>
wrote:

> On Wed, 5 Mar 2008 05:42:10 -0800 (PST), Karsten Wutzke
> <kwut...@web.de> wrote, quoted or indirectly quoted someone who said :

>
> >catch ( SocketTimeoutException ste )
> > {
> > //doesn't flush
> > System.out.print(".");
> > System.out.flush();
> > 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 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

unread,
Mar 10, 2008, 5:30:06 PM3/10/08
to

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

--

Knute Johnson
email s/nospam/linux/

--

Patricia Shanahan

unread,
Mar 10, 2008, 5:40:21 PM3/10/08
to
Karsten Wutzke wrote:
...

> 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

unread,
Mar 11, 2008, 12:20:22 AM3/11/08
to

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

0 new messages