Hi

Wouldn't it also be interesting to know how much progress was made -- if at all 
possible ?

For example: having a prospective number of bytes to write and have the update 
method called with the number of bytes just written ?

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

Reply via email to