
Signature
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com
> On Sat, 01 Sep 2007 20:58:43 GMT, "Crouchez"
> <blah@bllllllahblllbllahblahblahhh.com> wrote, quoted or indirectly
[quoted text clipped - 6 lines]
> In short BufferedWriter constructor takes the size in chars. 4096
> chars = 8192 bytes.
It doesn't matter if you put a buffer of 1024 it still pushes a buffer
through of 8192
out = new AnOutputStream( 1024); //buf then set as 1024
p = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
out,"UTF-8"),1024));
p.print(string) x 4000 times eg.
result of public synchronized void write(byte b[], int off, int len) in out
len:8192
...
Lew - 02 Sep 2007 20:16 GMT
> out = new AnOutputStream( 1024); //buf then set as 1024
> p = new PrintWriter(
> new BufferedWriter(new OutputStreamWriter(
> out,"UTF-8"),1024));
>
> len:8192
> when I p.print(somestring) a number of times it pushes the bytes to mystream
a.k.a. "out"
> in 8192 chunks. How come when I've set BufferWriter to 4096?
To be clear - you are seeing writes to the underlying stream in 8 KiB chunks?
You aren't measuring the writes in either of the Writers?
Had you considered reading the API docs for OutputStreamWriter?
<http://java.sun.com/javase/6/docs/api/java/io/OutputStreamWriter.html>
wherein it lets you know that:
> Each invocation of a write() method causes the encoding converter to be invoked on the given character(s).
> The resulting bytes are accumulated in a buffer before being written to the underlying output stream. The size of this buffer may be specified, but by default it is large enough for most purposes.
Dollars to doughnuts the size of that OutputStreamWriter buffer on your system
is 8 KiB. Any takers?
Aren't the API docs wonderful?

Signature
Lew
Crouchez - 02 Sep 2007 21:48 GMT
>> out = new AnOutputStream( 1024); //buf then set as 1024
>> p = new PrintWriter(
[quoted text clipped - 24 lines]
>
> Aren't the API docs wonderful?
So you can't set this value unless you create your own version of it? So
sun.nio.cs.StreamEncoder buffers at 8192 potentially causing buffer
overflows at the end of the line?
"The size of this buffer may be specified, but by default it is large enough
for most purposes. "
Specified where exactly?
Lew - 02 Sep 2007 22:55 GMT
"Lew" <lew@lewscanon.com> wrote in message
>> Aren't the API docs wonderful?
> So you can't set this value unless you create your own version of it? So
> sun.nio.cs.StreamEncoder buffers at 8192 potentially causing buffer
I'm not sure that's the class defining the buffer. How are you determining
that it is?
> overflows at the end of the line?
There should be no risk of buffer overflow.
> "The size of this buffer may be specified, but by default it is large enough
> for most purposes. "
>
> Specified where exactly?
Sometimes the API docs are not so wonderful. There is no apparent method or
constructor to set the value.
Regardless, you can always get the buffer to flush by calling flush(), so you
don't need to worry about crud being caught in the buffer. Just put a
finally
{
p.flush();
}
in the right place, and you should be fine.
Where the API docs are not so wonderful is in the documentation of these
Writers' buffer strategies, although we've seen that they at least document
that they have them. It makes it hard on us programmers to account for
multiple buffers and the concomitant inefficiencies.
Unless the Writers in question are smart enough to share their buffers? I
don't know - I am far too lazy to read through the publicly available source
code to find out for myself.
I do know that one can at least make sure, as you've done, that there are at
least some buffers. Your BufferedWriter of size 4096 will hold 8192 bytes in
its buffer, apparently a good match for the default (and ineluctable)
OutputStreamWriter buffer. Finish with a flush() and all should be well.

Signature
Lew
Roedy Green - 03 Sep 2007 03:19 GMT
On Sun, 02 Sep 2007 18:11:14 GMT, "Crouchez"
<blah@bllllllahblllbllahblahblahhh.com> wrote, quoted or indirectly
quoted someone who said :
>It doesn't matter if you put a buffer of 1024 it still pushes a buffer
>through of 8192
Again, how do you know this?

Signature
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com