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
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
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
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?
Are you running the program in an ordinary text console, or using
something like Netbeans?
/gordon
--
I'm using Cygwin, nothing that special I suppose.
Karsten
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
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.
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
>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
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
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
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).
>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");
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/
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ö
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
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/
--
Often, conversion between a GUI and GUI-less program changes the
threading structure.
Patricia
I'm pretty sure that his problem is in the code we are not seeing.