On Tue, Sep 25, 2012 at 2:23 AM, Felix Meschberger <fmesc...@adobe.com>wrote:
> Hi > > Wouldn't it also be interesting to know how much progress was made -- if > at all possible ? > Because ProgressOutputStream extends CountingOutputStream you can call getByteCount() in your observer. > For example: having a prospective number of bytes to write and have the > update method called with the number of bytes just written ? > I suppose you could have ProgressPercentageOutputStream that you can build with an expectedByteCount and a chunkCount to get a (possibly incorrect) percentage. The trick with OutputStream is that you do not know how big they are... but if you are starting with a File, you can get the file length... Gary > > Regards > Felix > > Am 25.09.2012 um 03:57 schrieb Gary Gregory: > > > Hi All, > > > > I had a need for a ProgressOutputStream that behaved in kind to: > > > > /* > > * Licensed to the Apache Software Foundation (ASF) under one or more > > * contributor license agreements. See the NOTICE file distributed with > > * this work for additional information regarding copyright ownership. > > * The ASF licenses this file to You under the Apache License, Version 2.0 > > * (the "License"); you may not use this file except in compliance with > > * the License. You may obtain a copy of the License at > > * > > * http://www.apache.org/licenses/LICENSE-2.0 > > * > > * Unless required by applicable law or agreed to in writing, software > > * distributed under the License is distributed on an "AS IS" BASIS, > > * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > * See the License for the specific language governing permissions and > > * limitations under the License. > > */ > > public class ProgressOutputStreamTestCase { > > > > @Test > > public void testSize100in10Chunks() throws IOException { > > byte[] ba10 = new byte[10]; > > ByteArrayOutputStream baos = new ByteArrayOutputStream(); > > ProgressOutputStream pos = new ProgressOutputStream(baos, 10, new > > ProgressOutputStream.Observer() { > > > > @Override > > public void update(ProgressOutputStream progressOutputStream) > { > > System.out.print('.'); > > } > > > > @Override > > public void flush(ProgressOutputStream progressOutputStream) { > > System.out.println(); > > } > > }); > > for (int i = 0; i < 10; i++) { > > pos.write(ba10); > > } > > pos.flush(); > > pos.close(); > > Assert.assertEquals(10, pos.getChunkCount()); > > } > > > > @Test > > public void testSize100in10ChunksSystemOut() throws IOException { > > byte[] ba10 = new byte[10]; > > ByteArrayOutputStream baos = new ByteArrayOutputStream(); > > ProgressOutputStream pos = new ProgressOutputStream(baos, 10, new > > ProgressOutputStream.SystemOutObverver()); > > for (int i = 0; i < 10; i++) { > > pos.write(ba10); > > } > > pos.flush(); > > pos.close(); > > Assert.assertEquals(10, pos.getChunkCount()); > > } > > } > > > > Which I wrote up as: > > > > /* > > * Licensed to the Apache Software Foundation (ASF) under one or more > > * contributor license agreements. See the NOTICE file distributed with > > * this work for additional information regarding copyright ownership. > > * The ASF licenses this file to You under the Apache License, Version 2.0 > > * (the "License"); you may not use this file except in compliance with > > * the License. You may obtain a copy of the License at > > * > > * http://www.apache.org/licenses/LICENSE-2.0 > > * > > * Unless required by applicable law or agreed to in writing, software > > * distributed under the License is distributed on an "AS IS" BASIS, > > * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > * See the License for the specific language governing permissions and > > * limitations under the License. > > */ > > > > /** > > * Notifies an observer of writing progress to an OutputStream. > > */ > > public class ProgressOutputStream extends CountingOutputStream { > > > > public static interface Observer { > > > > void flush(ProgressOutputStream progressOutputStream); > > > > void update(ProgressOutputStream progressOutputStream); > > > > } > > > > public static class PrintStreamObverver implements > > ProgressOutputStream.Observer { > > > > private final PrintStream printStream; > > > > public PrintStreamObverver(final PrintStream printStream) { > > this.printStream = printStream; > > } > > > > @Override > > public void flush(final ProgressOutputStream > progressOutputStream) { > > this.printStream.println(); > > } > > > > @Override > > public void update(final ProgressOutputStream > progressOutputStream) > > { > > this.printStream.print('.'); > > } > > } > > > > public static class SystemErrObverver extends PrintStreamObverver { > > > > public SystemErrObverver() { > > super(System.err); > > } > > > > } > > > > public static class SystemOutObverver extends PrintStreamObverver { > > > > public SystemOutObverver() { > > super(System.out); > > } > > > > } > > > > private final long chunkSize; > > > > private long chunkCount; > > > > private final Observer observer; > > > > public ProgressOutputStream(final OutputStream proxy, final long > > chunkSize, final Observer observer) { > > super(proxy); > > this.chunkSize = chunkSize; > > this.observer = observer; > > } > > > > @Override > > protected void afterWrite(final int n) throws IOException { > > super.afterWrite(n); > > if (this.getByteCount() % this.getChunkSize() == 0) { > > this.chunkCount++; > > this.getObserver().update(this); > > } > > } > > > > @Override > > public void flush() throws IOException { > > super.flush(); > > this.getObserver().flush(this); > > } > > > > public long getChunkCount() { > > return this.chunkCount; > > } > > > > public long getChunkSize() { > > return this.chunkSize; > > } > > > > public Observer getObserver() { > > return this.observer; > > } > > > > } > > > > Thoughts for inclusion to [io]? > > > > Gary > > -- > > E-Mail: garydgreg...@gmail.com | ggreg...@apache.org > > JUnit in Action, 2nd Ed: <http://goog_1249600977>http://bit.ly/ECvg0 > > Spring Batch in Action: <http://s.apache.org/HOq>http://bit.ly/bqpbCK > > Blog: http://garygregory.wordpress.com > > Home: http://garygregory.com/ > > Tweet! http://twitter.com/GaryGregory > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > -- E-Mail: garydgreg...@gmail.com | ggreg...@apache.org JUnit in Action, 2nd Ed: <http://goog_1249600977>http://bit.ly/ECvg0 Spring Batch in Action: <http://s.apache.org/HOq>http://bit.ly/bqpbCK Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory