commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Felix Meschberger <fmesc...@adobe.com>
Subject Re: [io] Proposal for a ProgressOutputStream
Date Tue, 25 Sep 2012 15:52:00 GMT
Thanks for the hints.

Regards
Felix

Am 25.09.2012 um 17:50 schrieb Gary Gregory:

> On Tue, Sep 25, 2012 at 2:23 AM, Felix Meschberger <fmeschbe@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: garydgregory@gmail.com | ggregory@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-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>> 
>> 
> 
> 
> -- 
> E-Mail: garydgregory@gmail.com | ggregory@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-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message