Home > Archive > Java Help > March 2008 > System.out PrintWriter print() and flush() not flushing?
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
System.out PrintWriter print() and flush() not flushing?
|
|
| Karsten Wutzke 2008-02-29, 4:36 am |
| 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 2008-02-29, 4:36 am |
| Karsten Wutzke wrote:
> 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
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 2008-02-29, 4:36 am |
| On 29 Feb., 05:54, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> Karsten Wutzke wrote:
>
>
>
>
>
>
> 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
| |
| Knute Johnson 2008-02-29, 4:36 am |
| Karsten Wutzke wrote:
> 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
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?
--
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
| |
| Gordon Beaton 2008-02-29, 4:36 am |
| 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 2008-02-29, 4:36 am |
| On 29 Feb., 07:44, Gordon Beaton <n....@for.email> wrote:
> On Thu, 28 Feb 2008 21:12:35 -0800 (PST), Karsten Wutzke wrote:
>
>
>
> 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
| |
| Karsten Wutzke 2008-02-29, 4:36 am |
| On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> Karsten Wutzke wrote:
>
>
>
>
>
>
>
>
>
>
>
>
>
> 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?
>
> --
>
> 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
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 2008-02-29, 7:23 pm |
| Karsten Wutzke wrote:
> On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> wrote:
>
> 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.
--
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 2008-03-05, 4:35 am |
| On 29 Feb., 18:32, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> Karsten Wutzke wrote:
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 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
| |
| Roedy Green 2008-03-05, 4:35 am |
| On Thu, 28 Feb 2008 20:26:51 -0800 (PST), Karsten Wutzke
<kwutzke@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 2008-03-05, 8:22 am |
| 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 :
>
>
> 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 2008-03-05, 8:22 am |
| 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 :
>
>
> 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 2008-03-05, 7:23 pm |
| 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/vie...?bug_id=4672570
| |
| Roedy Green 2008-03-05, 10:17 pm |
| On Wed, 5 Mar 2008 05:42:10 -0800 (PST), Karsten Wutzke
<kwutzke@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 Glossary
http://mindprod.com
| |
| Knute Johnson 2008-03-06, 7:20 pm |
| Karsten Wutzke wrote:
>
> 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
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/
--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDem
| |
| Roger Lindsjö 2008-03-08, 7:20 pm |
| Karsten Wutzke wrote:
> On 29 Feb., 06:23, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
> wrote:
>
> 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>
--
Roger Lindsjö
| |
| Karsten Wutzke 2008-03-10, 10:30 pm |
| 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 :
>
>
> 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 2008-03-10, 10:30 pm |
| Karsten Wutzke wrote:
> On 6 Mrz., 03:41, Roedy Green <see_webs...@mindprod.com.invalid>
> wrote:
>
> 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/
--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDemon.com<<<<<<------
Unlimited Access, Anonymous Accounts, Uncensored Broadband Access
| |
| Patricia Shanahan 2008-03-10, 10:30 pm |
| 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 2008-03-11, 4:58 am |
| Patricia Shanahan wrote:
> Karsten Wutzke wrote:
> ...
> ...
>
> 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.
--
Knute Johnson
email s/nospam/linux/
--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDemon.com<<<<<<------
Unlimited Access, Anonymous Accounts, Uncensored Broadband Access
|
|
|
|
|